【问题标题】:C# protobuf-net - default value overwrites value from protobuf dataC# protobuf-net - 默认值覆盖 protobuf 数据中的值
【发布时间】: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。

如何解决此问题?

【问题讨论】:

    标签: c# protobuf-net


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    相关资源
    最近更新 更多