【问题标题】:Serializing and Deserializing Multiple Objects序列化和反序列化多个对象
【发布时间】:2013-05-01 06:02:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 为什么不将所有这些对象放入List<object> 并序列化该数据结构?您将防止许多极端情况,例如被认为是“分离”的对象之间的相互依赖关系。
  • @OndrejTucny 他想追加到文件而不加载所有以前的条目。
  • 他说了原因,看起来很合理。要在对象级别反序列化,您必须在每个条目后编写定界符序列,并在读回文件时对其做出反应。

标签: c# file object serialization


【解决方案1】:

使用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;
}

【讨论】:

  • 如何从这个文件中反序列化对象?您可以使用 append 将许多对象序列化到文件中这一事实并不能保证您能够将它们反序列化。
  • @Artemix 查看编辑。根据他有问题的代码。这有什么问题吗?
  • 不会只使用filemode.append然后写工作吗?还是我必须说 filemode.append 和 fs.seek?
  • 我会测试一下,如果一切顺利的话会告诉你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 2014-12-24
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多