如何序列化到现有文件?

use*_*819 11 .net c# serialization

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

我该怎么做?

Mag*_*pie 20

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

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

以下代码反序列化对象.

var list = new List<ObjectToSerialize>();    

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Ela*_*ich 2

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

现在,如果您确实想将两个序列化对象存储在连接的单个文件中:

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

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

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