注意:我知道使用 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/