假设我有一个课程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。

最佳答案

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

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

但是,除非您需要一些特别的方法,否则最简单的答案是:


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

关于c# - 更新已序列化的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13575840/

10-17 01:12