[英]Issue using XMLSerializer to Serialize and Deserialize
我正在使用C#套接字并使用XMLSerializer
来发送和接收数据。 XML数据使用TCP / IP协议通过网络连接从服务器发送到客户端。 XML.Serializer.Serialize(stream)
序列化XML数据并通过套接字连接发送它们,但是当我想使用XMLSerializer.Deserialize(stream)
进行读取时。 发送的数据返回xml解析错误。
这是我的序列化方式:
Memory Stream ms = new MemoryStream();
FrameClass frame= new FrameClass ();
frame.string1 = "hello";
frame.string2 = "world";
XmlSerializer xmlSerializer = new XmlSerializer(frame.GetType());
xmlSerializer.Serialize(ms, frame);
socket.Send(ms.GetBuffer(), (int)ms.Length, SocketFlags.None);
反序列化:
FrameClass frame;
XmlSerializer xml = new XmlSerializer(typeof(FrameClass));
frame= (FrameClass)xml.Deserialize(new MemoryStream(sockCom.SocketBuffer));
listbox1.Items.Add(frame.string1);
listbox2.Items.Add(frame.string2);
我认为这与一个接一个地发送数据有关。 谁能教我如何正确执行此操作?
尝试反序列化之前,您是否已收到所有数据(代码中尚不清楚)。 我倾向于将所有数据接收到本地字符串中,然后从中进行反序列化,而不是尝试直接从套接字中反序列化。 它还可以让您在反序列化之前实际在调试器中查看数据。
尝试这个:
using (MemoryStream ms = new MemoryStream())
{
FrameClass frame= new FrameClass ();
frame.string1 = "hello";
frame.string2 = "world";
XmlSerializer xmlSerializer = new XmlSerializer(frame.GetType());
xmlSerializer.Serialize(ms, frame);
ms.Flush();
socket.Send(ms.GetBuffer(), (int)ms.Length, SocketFlags.None);
}
如果要一个接一个地发送Frame XML,那么就不发送XML文档。 XML Serializer将尝试反序列化整个文档!
我现在没有时间进行研究,但请查看XmlReaderSettings属性以读取XML片段。 然后,您将使用这些设置在内存流上创建一个XmlReader,并在循环中调用它。
重要的是冲洗流。 将流放在using
块中以确保快速清除也很有using
。
除了@John所说的Flush调用外,您的代码看起来还不错。
您说要发送多个FrameClass数据,那么代码应该只发送单个数据。
如果需要发送多个数据对象,则无法一次发送所有数据对象,否则反序列化过程将绊倒数据。 您可以在服务器与客户端之间建立一些通信,以便服务器知道它正在得到什么。
客户:我有一些数据
服务器:好的,我准备好了,发送
客户:发送
服务器:已完成处理
重复过程...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.