【发布时间】:2011-10-13 21:18:13
【问题描述】:
我有一个 Xml 消息列表,特别是我记录到文件中的 DataContract 消息。我正在尝试从文件中一一反序列化它们。我不想一次将整个文件读入内存,因为我希望它非常大。
我有这个序列化的实现,并且有效。我通过使用 FileStream 序列化并读取字节并使用正则表达式来确定元素的结尾来做到这一点。然后获取元素并使用 DataContractSerializer 获取实际对象。
但有人告诉我我应该使用更高级别的代码来完成这项任务,而且这似乎应该是可能的。我有以下代码,我认为它应该可以工作,但它没有。
FileStream readStream = File.OpenRead(filename);
DataContractSerializer ds = new DataContractSerializer(typeof(MessageType));
MessageType msg;
while ((msg = (MessageType)ds.ReadObject(readStream)) != null)
{
Console.WriteLine("Test " + msg.Property1);
}
上面的代码输入了一个包含以下内容的输入文件:
<MessageType>....</MessageType>
<MessageType>....</MessageType>
<MessageType>....</MessageType>
看来我可以正确读取和反序列化第一个元素,但之后它就失败了:
System.Runtime.Serialization.SerializationException was unhandled
Message=There was an error deserializing the object of type MessageType. The data at the root level is invalid. Line 1, position 1.
Source=System.Runtime.Serialization
我在某处读到这是由于 DataContractSerializer 使用填充的“\0”到最后的方式 - 但我无法弄清楚如何在从流中读取而不弄清楚结尾时解决这个问题MessageType 标记的其他方式。我应该使用另一个序列化类吗?或者也许是解决这个问题的方法?
谢谢!
【问题讨论】:
标签: c# filestream datacontractserializer