我使用TcpClient和TcpListener类在两个应用程序之间交换一些对象。我使用XML序列化(参见下面的代码)。基本上一切都很好。问题是,当一个应用程序在短时间内发送多个对象时,我在接收端的MemoryStream中有多个对象(多个根元素,也带有XML版本标记)。如何处理所有对象以及最佳方法是什么?我可以将列表中的对象分组并取消/序列化整个列表,但迟早我将面临同样的问题。 这看起来像我认为的常见问题,但我还没有找到解决方案。
要序列化的对象:
public class DataModel
{
public string Command { get; set; }
public string Value { get; set; }
// ctor etc
}
接收方:
private void onRead(IAsyncResult ar)
{
int nBytes = _client.GetStream().EndRead(ar);
XmlSerializer serializer = new XmlSerializer(typeof(DataModel));
MemoryStream memStream = new MemoryStream(buffer);
DataModel dmo = (DataModel)serializer.Deserialize(memStream);
buffer = new byte[1024];
_client.GetStream().BeginRead(buffer, 0, buffer.Length, new AsyncCallback(onRead), null);
// read on if more available...
}
示例流内容:
<?xml version="1.0"?>
<DataModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Command>XXX</Command>
<Value>1.0</Value>
</DataModel><?xml version="1.0"?>
<DataModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Command>XXX</Command>
<Value>5</Value>
</DataModel><?xml version="1.0"?>
<DataModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Command>XXX</Command>
<Value>YYY</Value>
</DataModel>
我删除了try / catch,调试了一些不必要的东西
答案 0 :(得分:0)
首先,您是否同意这种模式?也许其他应用程序有一个错误,应该分别发送每个Xml文档。在哪个演员阵容中,这不是你需要解决的问题。
但是,如果您确实同意这一点,或者正在使用持久连接:
你的问题与Xml无关。对于通过开放连接发送的任何类型的内容,您可能会遇到同样的问题。
问题是你没有正确地“构建”传入流。
您已分别从流中读取每个单独的XmlDocument,每个XmlDocument都有自己的内部Stream。那么你可以做任何你想要的,因为它现在是有效的Xml。
您可以逐字节读取,查找声明以指示下一个文档,或者您可以使用XmlReader,也可以测试下一个声明,否则会引发异常。