XML序列化.出现文件结尾

本文关键字:文件 结尾 序列化 XML | 更新日期: 2023-09-27 18:27:43

我尝试以这种方式序列化15个对象的列表:

                XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Employee>));
                MemoryStream memStream = new MemoryStream();
                // Serialize
                xmlSerializer.Serialize(stream, allKnownWorkers);
                memStream.Position = 0;
                data = memStream.GetBuffer();
                Console.WriteLine("Transmitting.....");

                stream.Write(data, 0, data.Length); // NetworkStream

反序列化看起来像:

            // Read the first batch of the TcpServer response bytes.
            Int32 bytes = stream.Read(data, 0, data.Length);
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Employee>));
            MemoryStream memStream = new MemoryStream();
            memStream.Write(data, 0, bytes);
            memStream.Position = 0;
            // Deserialize
            workers.AddRange((List<Employee>)xmlSerializer.Deserialize(memStream));

我在反序列化的最后一行得到一个异常:Unexpected end of file has occurred. The following elements are not closed: ...当我发送只有几个对象的列表时,它可以正常工作。我想流缓冲区长度有问题。我该怎么修?

非常感谢!

XML序列化.出现文件结尾

您将基于流的网络连接视为基于消息的连接。但事实并非如此。因此,您不能指望从流中读取一次就可以返回单个对象的所有数据,甚至是一次传输。

相反,您需要在协议中设计一种方法,以了解何时读取了一个处理单元的所有数据(无论在给定的上下文中发生什么……这里似乎是一个XML文档)。

有很多方法可以做到这一点。我想说,最简单的两种方法是,要么在XML数据之前先传输字节计数,这样接收器就知道在尝试读取XML之前要读取多少字节,要么简单地将XML解析构建到流读取中。

在后一点上,您可以尝试仅将网络流交给XmlSerializer。我不记得它能处理得有多好,但只要XmlSerializer在获得完整的XML文档后停止读取,而不是试图一直读取到流的末尾,它就可以工作。但是,即使XmlSerializer不只是免费提供给您,也应该很难检测到XML文档根元素的开始标记,然后继续读取数据,直到读取结束标记。