繁体   English   中英

使用XMLSerializer进行序列化和反序列化的问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM