更新已经序列化的对象

时间:2012-11-27 00:58:56

标签: c# protobuf-net

假设我有一个班级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)

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

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

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

1 个答案:

答案 0 :(得分:1)

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

如果您需要定期 ,并且需要快速追加,我可能会建议(在您的应用级别)一种策略,允许您替换对象只需在最后添加一个新版本 - 即如果你看到一个重复的id,则假设替换之前的事件 - 但是,这意味着你的读取需要读取所有内容,因此它可能是一个想偶尔重新定位。

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

  • 将内容反序列化为列表(或类似)
  • 进行所需的更改
  • 序列化