Protobuf-net将对象实例追加到流中,反序列化为列表

Protobuf-net Append Object Instances into Stream, Deserialize as List

我将 class 的多个实例存储在一个列表中,当我关闭我的程序时,我使用序列化方法将列表保存到一个文件中。

但是,List 的大小可能很大,所以我想知道是否有一种方法可以在运行时将对象实例序列化并附加到文件中,然后在需要时将文件反序列化为 List。

如果有办法,能否分享一个例子?

您可以使用 WriteDelimitedTo 方法将对象的单个实例添加到文件中,而不是序列化整个列表。

var persons = new List<Person>();

添加元素时,将其保存到文件中。注意 FileMode.Append.

Person person = ...
persons.Add(person);

using (var fileStream = new FileStream("persons.dat", FileMode.Append))
{
    person.WriteDelimitedTo(fileStream);
}

如有必要,请不要忘记在保存第一项之前删除或截断文件。


在反序列化过程中,我们使用ParseDelimitedFrom方法一个一个地读取对象,然后手动将它们添加到列表中。

using (var fileStream = new FileStream("persons.dat", FileMode.Open))
{
    while (fileStream.Position != fileStream.Length)
    {
        var person = Person.Parser.ParseDelimitedFrom(fileStream);
        persons.Add(person);
    }
}

如有必要,请不要忘记在添加项目之前清除列表。

谢谢大家的回答。我使用 SerializeWithLengthPrefix 方法将对象实例保存到带有 FileMode.Append 选项的文件中。为了从文件中以列表的形式读回对象实例,我刚刚使用了 Deserialize 方法。通过这样做,我可以将序列化的对象实例附加到文件中,现在我可以将文件中的对象实例直接反序列化为一个列表。