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



我将一个类的多个实例存储在List中,当我关闭程序时,我会使用Serialize方法将List保存到一个文件中。

然而,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方法。通过这样做,我可以将序列化的对象实例附加到文件中,现在我可以将文件中的对象实例直接反序列化到List中。

最新更新