XML从具有多个对象的流中反序列化

时间:2016-09-13 14:33:41

标签: c# xml serialization tcp memorystream

我使用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,调试了一些不必要的东西

1 个答案:

答案 0 :(得分:0)

首先,您是否同意这种模式?也许其他应用程序有一个错误,应该分别发送每个Xml文档。在哪个演员阵容中,这不是你需要解决的问题。

但是,如果您确实同意这一点,或者正在使用持久连接:

你的问题与Xml无关。对于通过开放连接发送的任何类型的内容,您可能会遇到同样的问题。

问题是你没有正确地“构建”传入流。

您已分别从流中读取每个单独的XmlDocument,每个XmlDocument都有自己的内部Stream。那么你可以做任何你想要的,因为它现在是有效的Xml。

您可以逐字节读取,查找声明以指示下一个文档,或者您可以使用XmlReader,也可以测试下一个声明,否则会引发异常。