c#默认值覆盖来自protobuf数据的值

本文关键字:数据 protobuf 默认值 覆盖 | 更新日期: 2023-09-27 18:10:11

我需要使用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数据的值

出于性能原因,默认值根本不序列化。bool默认为false。您的默认值为true。要做到这一点,您必须使用DefaultValueAttribute:

使您的默认值已知。
    [ProtoMember( 3, IsRequired = false, Name = "myBoolean", DataFormat =  DataFormat.Default )]
    [DefaultValue(true)]
    public Boolean MyBoolean { get; set; } = true;