2013-05-07 7 views
5

Я создаю библиотеку регистрации ошибок, которая создает файл в указанном месте, а затем сохраняет информацию об ошибке в этом файле, которая затем может быть прочитана отдельной программой-указателем, которую я намереваюсь написать вместе с этой библиотекой.Сериализация и десериализация нескольких объектов

Способ сохранения я в двоичном формате (с использованием BinaryFormatter() и FileStream()), где я сериализую класс ErrorEntry в файл и добавляю его в конец файла. Это означает, что у меня есть серия ErrorEntries. У меня нет его как списка, потому что, похоже, практически не нужно читать всю информацию в списке из файла, добавлять запись, а затем сохранять ее обратно в файл и выгружать ресурсы. Представляется гораздо более эффективным только сделать только одну команду записи и просто сохранить каждый в качестве своего собственного объекта, который сериализуется.

Моя проблема заключается в том, что я могу найти несколько примеров сериализации списков или отдельных объектов, но ничего не на нескольких, а на отдельных объектах. Хотя я хочу сохранить их как отдельные объекты, когда я их загружаю, я хочу прочитать объект и вернуть серию в виде списка этого объекта. Я думаю, что есть что-то похожее на

while(!EOF) 
{ 
    //deserialize each object 
    //add individual object to a list 
} 
//return the list of objects 

Как бы я хотел бы десериализовать каждый объект из одного файла? Есть ли у него внутренний маркер, который работает выше, и мне просто нужно определить, является ли это окончанием файла, или мне нужно сделать что-то еще, чтобы их прочитать?

+0

Почему вы не просто положить все эти объекты в '' Список и сериализовать эту структуру данных? Вы предотвратите множество угловых случаев, таких как взаимозависимости между объектами, которые считаются «отдельными». –

+0

@OndrejTucny он хочет добавить файл без загрузки всех предыдущих записей. – weston

+0

Он сказал, почему и выглядит разумно. Чтобы десериализоваться на уровне объекта, вы должны написать последовательность разделителей после каждой записи и отреагировать на нее при чтении файла. – Tommi

ответ

6

С FileStream fs; вы можете сделать fs.Position!=fs.Length для обнаружения EOF.

При добавлении используйте FileMode.Append или fs.Seek(0, SeekOrigin.End);, чтобы перейти к концу, прежде чем накладывать новую запись.

десериализации в полном объеме:

public static ICollection<T> DeserializeList<T>(FileStream fs) 
{ 
    BinaryFormatter bf = new BinaryFormatter(); 
    List<T> list = new List<T>(); 
    while(fs.Position!=fs.Length) 
    { 
     //deserialize each object in the file 
     var deserialized = (T)bf.Deserialize(fs); 
     //add individual object to a list 
     list.Add(deserialized); 
    } 
    //return the list of objects 
    return list; 
} 
+1

Как насчет десериализации объектов из этого файла? Тот факт, что вы можете сериализовать многие объекты в файле с помощью append, не гарантирует, что вы сможете их десериализовать. – Artemix

+0

@Artemix смотреть редактирование. Исходя из его кода. Что-то не так с этим? – weston

+0

не просто использовал filemode.append, а затем написал работу? или я должен сказать filemode.append и fs.seek? –

Смежные вопросы