我正在使用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);
我认为这与一个接一个地发送数据有关。 任何人都可以教我如何正确地做到这一点吗?
答案 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数据,然后代码应该只发送一个数据。
如果您需要发送多个数据对象,那么您无法一次性发送它们,否则反序列化过程会偶然发现数据。 您可以在服务器和服务器之间建立一些通信;客户端,以便服务器知道它得到了什么。
客户:我有一些数据
服务器:好的我准备好了,发送它
客户端:发送
服务器:完成处理
重复过程...