在C#中以顺序方式使用BinaryFormatter

时间:2012-01-24 13:59:47

标签: c# serialization deserialization binaryfiles binary-data

注意:我知道在大文件中使用BinaryFormatter的缺点。但这是我朋友的家庭作业:

(。Net Framework 4)我创建了一个简单的Person类,它应该被序列化并写入二进制文件中。

  • 要插入,请按照以下步骤操作:打开/创建文件,查找文件末尾,添加序列化Person对象,关闭文件。我不想序列化List<Person>并立即全部写出来。
  • 对于阅读(基于index参数):打开文件,查找index位置(基于对象长度),在index反序列化对象,返回对象。
  • 删除:就像在index位置读取记录一样,转到索引位置,删除它,保存文件。

我不确定使用BinaryFormatter是否是正确的方法。例如对于插入,我见过如下例子:

FileStream fs = new FileStream(_fileName, FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, person);
fs.Close();  

导致文件中的所有数据丢失,文件只包含person对象。如何在文件中以顺序方式对对象进行二进制读/写/删除?我对插入的猜测是使用另一个流,将对象序列化到该流中。将流写入字节数组并使用该字节数组写入主文件流的末尾。但我想不出适合插入/删除操作的方法。是否有更适合的方法而不是BinaryFormatter

注意:为了更清楚,他告诉我老师要他们计算每次手术的时间 谢谢。

1 个答案:

答案 0 :(得分:2)

除第一行外,您的代码是正确的:

FileStream fs = new FileStream(_fileName, FileMode.Append)

这将允许formatter.Serialize(fs,person)将自己附加到文件中。

var listFromFile = new List<Person>();    

using (var fileStream = new FileStream("C:\file.dat", FileMode.Open))
{
    var bFormatter = new BinaryFormatter();
    while (fileStream.Position != fileStream.Length)
    {
         list.Add((Person)bFormatter.Deserialize(fileStream));
    }
}

这应该可以从文件中获取列表,就插入而言......在插入新对象并与删除相同时,您可能必须重写对象。