2013-05-07 102 views
5

我正在创建一个错误日志库,它在指定的位置创建一个文件,然后将错误信息保存在该文件中,然后可以通过我打算联合编写的单独的任务程序读取该错误信息与这个图书馆。序列化和反序列化多个对象

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

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

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

我该如何去反序列化每个对象从单个文件?它是否具有上述工作的内部标记,我只需检测它是否是文件的结尾,还是需要做其他操作才能读取它们?

+0

你为什么不干脆把所有的物体放到'名单'和序列化数据结构?您将防止许多角落案例,例如被认为是“独立”的对象之间的相互依赖关系。 – 2013-05-07 10:19:13

+0

@OndrejTucny他想追加到文件中而不加载所有以前的条目。 – weston 2013-05-07 10:22:18

+0

他说为什么它看起来合理。要在对象级别反序列化,您必须在每次输入后编写分隔符序列,并在读取文件时对其作出反应。 – Tommi 2013-05-07 10:22:50

回答

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; 
} 
+1

如何从该文件反序列化对象?事实上,您可以使用附加序列化许多对象到文件并不保证您将能够将它们反序列化。 – Artemix 2013-05-07 10:30:00

+0

@Artemix见编辑。基于他的代码。那有什么不对吗? – weston 2013-05-07 10:37:16

+0

不会只是使用filemode.append然后写作业?或者我必须说filemode.append和fs.seek? – 2013-05-07 10:49:20