C# protobuf-net - 默认值覆盖 protobuf 数据中的值

Posted

技术标签:

【中文标题】C# protobuf-net - 默认值覆盖 protobuf 数据中的值【英文标题】:C# protobuf-net - default value overwrites value from protobuf data 【发布时间】:2015-08-28 13:54:47 【问题描述】:

我需要使用 protobuf-net serialize/deserialize 类。对于我的类的某些属性,我需要定义一个默认值。我通过设置属性的值来做到这一点。在某些情况下,此默认值会覆盖 protobuf 数据中的值。

代码示例:

public class Program

    static void Main(string[] args)
    
        var target = new MyClass
        
            MyBoolean = false
        ;

        using (var stream = new MemoryStream())
        
            Serializer.Serialize(stream, target);
            stream.Position = 0;
            var actual = Serializer.Deserialize<MyClass>(stream);
            //actual.MyBoolean will be true
        
    


[ProtoContract(Name = "MyClass")]
public class MyClass

    #region Properties

    [ProtoMember(3, IsRequired = false, Name = "myBoolean", DataFormat = DataFormat.Default)]
    public Boolean MyBoolean  get; set;  = true;

    #endregion

反序列化数据后,MyBoolean 的值为 true。

如何解决此问题?

【问题讨论】:

【参考方案1】:

出于性能原因,默认值根本不序列化。 bool 的默认值为 false。您的默认值为 true。要完成这项工作,您必须使用 DefaultValueAttribute 告知您的默认值:

    [ProtoMember( 3, IsRequired = false, Name = "myBoolean", DataFormat =  DataFormat.Default )]
    [DefaultValue(true)]
    public Boolean MyBoolean  get; set;  = true;

【讨论】:

好的,但是为什么我的代码不起作用……我的意思是在类的构造函数中设置了属性……这如何覆盖 protobuf 数据中的值? @musium - protobuf 数据中的值false isn't,因为 protobuf 认为序列化它没有任何意义,因为 false 是默认值一个布尔值。 Protobuf 没有意识到MyBoolean您的 默认值为true。更多信息:code.google.com/p/protobuf-net/issues/detail?id=199

以上是关于C# protobuf-net - 默认值覆盖 protobuf 数据中的值的主要内容,如果未能解决你的问题,请参考以下文章

覆盖结构中的默认值 (c#)

protobuf-net - 反引号、字典和 .proto 文件

如何在 C# 中覆盖默认值(T)? [复制]

C++ 中的 Google ProtoBuf 与 C# (UDP) 中的 Protobuf-net 聊天

关于在 C# 中使用 Protobuf-Net

协议缓冲区 c# (protobuf-net) Message::ByteSize