2011-01-20 106 views
1

我正在使用C#套接字并使用XMLSerializer来发送和接收数据。 XML数据通过使用TCP/IP协议的网络连接从服务器发送到客户端。 XML.Serializer.Serialize(stream)将XML数据序列化并通过套接字连接发送,但是当我想使用XMLSerializer.Deserialize(stream)进行读取时。发送的数据返回一个xml解析错误。使用XMLSerializer进行序列化和反序列化的问题

这里是我如何序列化:

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); 

我认为这是与发送之后的另一个数据之一。 任何人都可以教我如何正确地做到这一点?

+0

我会在文本编辑框中使用代码示例格式化程序。突出显示您的代码并单击编辑器工具栏中的“{}”选项。 – Wesley 2011-01-20 15:57:11

回答

0

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

+0

发生了什么是当我收到消息,在套接字缓冲区,它正在堆叠所有收到的对象,所以现在当我试图将该套接字缓冲区转换为对象(在这种情况下框架类)它是抛出一个错误的原因该缓冲区中有多个框架类对象。 – Jeff 2011-01-20 16:09:31

+0

是的,所以把所有的框架都拉出来,把它们放到一个单独的字符串中,然后反序列化。 – ctacke 2011-01-20 16:30:09

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); 
} 

如果你前一后发送帧XML一个正确的,那么你就不能发送的XML文档。 XML序列化器将尝试反序列化您的整个文档!

我现在没有时间研究这个问题,而是查看用于读取XML片段的XmlReaderSettings属性。然后,您将使用这些设置在内存流上创建一个XmlReader,并在循环中调用它。

重要的是冲洗流。将流放入using区块以确保快速清理也很有用。

0

除了@John关于Flush调用的说法,你的代码看起来没问题。

你说你正在发送多个FrameClass数据段,那么代码应该只发送一段数据。

如果您需要发送多个数据对象,那么您不能一次发送全部数据对象,否则反序列化过程会偶然发现数据。 您可以在服务器&客户端之间设置一些通信,以便服务器知道它正在获得什么。

客户:我有一些数据

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

客户端:发送

服务器:做处理

重复过程...