У меня есть список сообщений 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 другим способом. Есть ли другой класс сериализации, который я должен использовать? или, может быть, обойти эту проблему?
Спасибо!