【问题标题】:Protobuf-net Append Object Instances into Stream, Deserialize as ListProtobuf-net 将对象实例追加到流中,反序列化为列表
【发布时间】:2020-07-23 16:29:50
【问题描述】:

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

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

如果有办法,可以分享一个例子吗?

【问题讨论】:

  • 请在minimal reproducible example 上分享您目前的进展情况。
  • @alexander-petrov 的回答效果很好,完全解决了您的问题。将其标记为已接受的答案是礼貌和正确的。
  • 我以不同的方式解决了这个问题,但它确实有效。谢谢你的建议。

标签: c# protobuf-net


【解决方案1】:

您可以使用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);
    }
}

如果需要,不要忘记在添加项目之前清除列表。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-06
      • 2012-03-07
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多