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

标签 c# serialization deserialization binaryfiles binary-data

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

(.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

注:为了更清楚,他告诉我老师要他们计算每个操作的时间量。
谢谢。

最佳答案

除了第一行,你的代码是正确的:

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));
    }
}

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

关于c# - 在 C# 中以顺序方式使用 BinaryFormatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8988073/

相关文章:

c# - Linq-to-sql 错误 : 'int[]' does not contain a definition for 'Contains'

c# - F# 在非确定性浮点计算方面是否受到相同的 C# 警告?

c# - 什么是更好的 oo 设计方案,为什么?

java - 支持对象版本的 Java 序列化库

java - 异常反序列化甚至简单的对象[JAVA]

java - 在客户端使用额外变量但版本 ID 相同的序列化和反序列化

c# - 在字典的值集合上应用函数

c# - 来自 WebService 的未经净化的 XML,如何净化

class - 使用定义的输入过程从 Fortran 中的二进制文件中读取错误值

c# - 有没有办法让 Newtonsoft.Create 在界面上调用您的自定义创建方法?