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

本文关键字:反序列化 XML 对象 | 更新日期: 2023-09-27 18:07:01

我使用TcpClient和TcpListener类在两个应用程序之间交换一些对象。我使用XML序列化(见下面的代码)。基本上一切都很好。问题是,当一个应用程序在短时间内发送多个对象时,我在接收端的MemoryStream中有多个对象(多个根元素,也带有XML版本标记)。如何处理所有对象,最好的方法是什么?我可以将对象分组到List中,并对整个List进行反序列化,但迟早我将面临同样的问题。我认为这是一个常见的问题,但我还没有找到解决办法。

要序列化的对象:

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, debug和所有不必要的东西

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

首先,你同意这个模式吗?也许其他应用程序有bug,应该分别发送每个Xml文档。在cast中,这不是你要修复的问题。

但是,如果您同意这样做,或者正在使用持久连接:

您的问题与Xml无关。在打开的连接中,任何类型的内容都可能出现同样的问题。

问题是你没有正确地'分帧'传入流。

您已经分别从流中读取了每个单独的XmlDocument,每个都读取到它自己的内部流中。然后你可以对它做任何你想做的事情,因为它现在是有效的Xml。

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

相关文章: