序列化和反序列化多个对象
本文关键字:对象 反序列化 序列化 | 更新日期: 2023-09-27 18:12:21
我正在创建一个错误日志库,它在指定位置创建一个文件,然后将错误信息保存在该文件中,然后可以由我打算与该库一起编写的单独的任务程序读取。
我保存它的方式是二进制格式(使用BinaryFormatter()
和FileStream()
),在那里我序列化一个名为ErrorEntry的类到文件中,并将其附加到文件的末尾。这意味着我有一系列的errorrentry背靠背。我没有将其作为列表,因为必须从文件中将所有信息读取到列表中,添加一个条目,然后将其保存回文件并转储资源似乎并不实际。似乎只需要执行一个写命令,并将每个命令存储为序列化的单独对象更有效。
我的问题是我可以找到几个关于序列化列表或单个对象的例子,但是没有关于多个但单独的对象的例子。虽然我想将它们保存为单独的对象,但当我加载它们时,我想读取对象并将序列作为该对象的列表返回。我想应该有类似
的东西while(!EOF)
{
//deserialize each object
//add individual object to a list
}
//return the list of objects
如何从单个文件中反序列化每个对象?上面的工作是否有一个内部标记,我只需要检测它是否是文件的结束,或者我是否需要做其他事情来读取它们?
使用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;
}