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

时间:2011-01-20 15:50:39

标签: c# xml xml-serialization windows-ce xmlserializer

我正在使用C#套接字并使用XMLSerializer来发送和接收数据。 使用TCP / IP协议通过网络连接将XML数据从服务器发送到客户端。 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);

我认为这与一个接一个地发送数据有关。 任何人都可以教我如何正确地做到这一点吗?

3 个答案:

答案 0 :(得分:0)

您是否在尝试反序列化之前收到了所有数据(从您的代码中不清楚)。我倾向于将所有数据接收到本地字符串并从中反序列化,而不是尝试直接从套接字反序列化。它还允许您在反序列化之前实际查看调试器中的数据。

答案 1 :(得分:0)

试试这个:

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块中以确保快速清理它也很有用。

答案 2 :(得分:0)

除了@John关于Flush调用的说法之外,你的代码看起来还不错。

您说您正在发送多个FrameClass数据,然后代码应该只发送一个数据。

如果您需要发送多个数据对象,那么您无法一次性发送它们,否则反序列化过程会偶然发现数据。 您可以在服务器和服务器之间建立一些通信;客户端,以便服务器知道它得到了什么。

客户:我有一些数据

服务器:好的我准备好了,发送它

客户端:发送

服务器:完成处理

重复过程...