假设我有一个BinaryFomatter包含序列化对象的文件。现在我希望能够在现有文件上序列化另一个对象和APPEND。
我该怎么做?
答案 0 :(得分:20)
这确实是可能的。下面的代码附加了对象。
using (var fileStream = new FileStream("C:\file.dat", FileMode.Append))
{
var bFormatter = new BinaryFormatter();
bFormatter.Serialize(fileStream, objectToSerialize);
}
以下代码反序列化对象。
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));
}
}
请注意,为此,文件必须只包含相同的对象。
答案 1 :(得分:4)
将对象放入集合对象并进行序列化。如果您设法在现有文件的末尾追加对象的二进制表示,则会在阅读时遇到问题。
答案 2 :(得分:3)
实际上,如果您只是打开要写入的流,并将指针放在流的末尾,则可以序列化另一个对象,它将附加到现有流中。
反序列化也会读取对象,但不会更进一步。
显然,如果你想随机访问你的对象(反序列化对象nr.17,但不是它之前的所有东西),那么你需要一个每个对象开始位置的索引,但是如果你只想读取来自的对象一开始,你可以在彼此之后将它们序列化。
答案 3 :(得分:2)
这是怎么回事?
将第一个文件的内容反序列化为内存中的对象,将第一个对象添加到集合中(例如List <YourObjectType
&gt;),将新对象添加到该集合,然后序列化该集合(包含两个现在的对象)在现有文件的顶部。
答案 4 :(得分:2)
首先,如果你真正需要的是存储一个对象数组 - 将它们放在容器中并序列化容器,如前所述。
现在,如果你真的想将两个序列化对象存储在一个连接的文件中:
我不确定这是否可以“开箱即用”,但你可以做两件事。
使用或发明自己的半tar文件格式,在文件的开头(或结尾)写一个小标题,描述文件的内容(#'对象,和尺寸)。
编写C#代码以自行检测每个序列化对象的开头和结尾。我不完全确定这是可能的。 Here是序列化格式的非官方文档。它包含标题,但不保证此标题不会出现在文件中。