如何序列化到现有文件?

假设我有一个BinaryFomatter包含序列化对象的文件。 现在我希望能够在现有文件上序列化另一个对象并APPEND。

我该怎么做?

首先,如果您真正需要的是存储一个对象数组 – 将它们放入容器并序列化容器,如前所述。

现在,如果你真的想将两个序列化对象存储在一个连接的文件中:

我不确定这是否可以“开箱即用”,但你可以做两件事。

  1. 使用或发明自己的半tar文件格式,在文件的开头(或结尾)写一个描述文件内容的小标题(#’对象和大小)。

  2. 编写C#代码以自己检测每个序列化对象的开头和结尾。 我不完全确定这是可能的。 这是序列化格式的非官方文档。 它包含标题,但不保证此标题不会出现在文件中。

这确实是可能的。 下面的代码附加了该对象。

using (var fileStream = new FileStream("C:\file.dat", FileMode.Append)) { var bFormatter = new BinaryFormatter(); bFormatter.Serialize(fileStream, objectToSerialize); } 

以下代码反序列化对象。

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

请注意,为此,文件必须只包含相同的对象。

将对象放入集合对象并进行序列化。 如果您设法在现有文件的末尾追加对象的二进制表示,则会在阅读时遇到问题。

实际上,如果您只是打开要写入的流,并将指针放在流的末尾,则可以序列化另一个对象,它将附加到现有流中。

反序列化也将读取对象,但不会进一步。

显然,如果你想随机访问你的对象(反序列化对象nr.17,但不是它之前的所有东西),那么你需要一个每个对象开始位置的索引,但是如果你只想从头开始读取所有对象,你可以在彼此之后将它们序列化。

怎么样呢

将第一个文件的内容反序列化为内存中的对象,将第一个对象添加到集合中(例如List >),将新对象添加到该集合,然后序列化集合(现在包含两个对象)。现有文件。