3

假设我有一堂课MyClass

[ProtoContract]
public class MyClass
{
    [ProtoMember(1)]
    public string PropA { get; set; }
    [ProtoMember(2)]
    public string PropB { get; set; }
    // ...
    [ProtoMember(12)]
    public string PropL { get; set; }
}

我也有一个List<MyClass>protobuf-net 二进制文件被反序列化到其中。如何即时更新MyClass序列化文件中包含的实例(可能包含数百或数千个序列化MyClass对象)?我查看了 Marc 对其他问题的一些评论,似乎我需要使用Deserialize并传入MyClass实例,但我看到的唯一方法签名是

public static T Deserialize<T>(System.IO.Stream source)

也许我需要使用合并?我不确定我应该如何使用它。

public static T MergeWithLengthPrefix<T>(System.IO.Stream source, T instance, ProtoBuf.PrefixStyle style)

我正在使用 protobuf-net v2.0.0.480。

4

1 回答 1

2

听起来您想更新对象的文件版本 - 对吗?如果是这样,不重写文件是不可能的 - 这就像问“我如何更新 xml 文件中间的元素” - 很容易做到,但你需要重写整个文件。好吧,从技术上讲,您可以在要更改的位之后重新编写内容,但坦率地说,最简单的选择可能是:读取然后重新写入。

如果这是您需要定期执行的操作,并且您需要快速追加,我可能会建议(在您的应用程序级别)一种策略,允许您通过简单地在末尾追加新版本来替换对象 - 即如果您看到重复id,假设它替换了较早的事件 - 但是,这意味着您的读取需要通读所有内容,因此偶尔重新设置可能是一个想法。

但是,除非您需要花哨的东西,否则最简单的答案是:

  • 将内容反序列化为列表(或类似列表)
  • 做出你需要的改变
  • 连载
于 2012-11-27T09:30:41.440 回答