【问题标题】:Protobuf C# how to remove field?Protobuf C#如何删除字段?
【发布时间】:2018-03-02 10:23:25
【问题描述】:

我在 protobuf 中将字段序列化为二进制文件。现在我想删除一个字段。

[ProtoMember(9, AsReference = true)]// to remove
 private MyClass obj; // to remove

现在我想离开序列化这个对象,并从序列化中删除,但我需要打开旧文件。所以我无法打开这些文件。当我尝试打开文件时出现异常:

Internal error; a key mismatch occurred

【问题讨论】:

  • 我不确定这是否有效/没有尝试过:删除属性注释并保留数字“空闲”(因为其他属性不应该有数字 9)。当您收到有关密钥不匹配的异常时,请尝试以下操作:在运行时模型中/为运行时模型创建一个新方案,按原样添加类型,然后调用 model[type].Add(9, "obj") 并尝试使用该方案进行反序列化。序列化显然只能使用Default 方案来完成。将其写为评论,因为我不知道这是否有效。以这种方式转换所有文件后,您可以删除 catch 块的属性和主体。

标签: c# serialization protocol-buffers protobuf-net


【解决方案1】:

您最好的选择可能是将其留在原处,然后添加:

private bool ShouldSerializeobj() => false;

这增加了成员obj的“条件序列化”,这意味着它不会被序列化。但是,反序列化时仍会对其进行处理。

注意:是AsReference = true 使这变得更加复杂。通常,您可以简单地删除该字段。

【讨论】:

    猜你喜欢
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多