序列化和反序列化多个对象

时间:2013-05-07 10:09:39

标签: c# file object serialization

我正在制作一个错误记录库,它在指定位置创建一个文件,然后将错误信息保存在该文件中,然后可以通过我打算与该库一起编写的单独任务程序读取。< / p>

我保存它的方式是二进制格式(使用BinaryFormatter()FileStream()),我将一个名为ErrorEntry的类序列化到文件中并将其附加到文件的末尾。这意味着我有一系列的ErrorEntries背靠背。我没有它作为列表,因为似乎不必将所有信息从文件读入列表,添加条目,然后将其保存回文件并转储资源。只需要执行一个写命令似乎更有效,只需将每个命令存储为自己的序列化对象。

我的问题是我可以找到关于序列化列表或单个对象的几个例子,但是在多个 - 但是单独的 - 对象上没有任何内容。虽然我想将它们保存为单个对象,但是当我加载它们时,我想要读取该对象并将该系列作为该对象的列表返回。我想有类似于

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

如何从单个文件中反序列化每个对象?它是否有一个内部标记,以上工作,我只需要检测它是否是文件的结尾,或者我是否需要做其他事情来阅读它们?

1 个答案:

答案 0 :(得分:6)

使用FileStream fs;,您可以fs.Position!=fs.Length来检测EOF。

在追加时,请使用FileMode.Appendfs.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;
}