使用内联初始化反序列化布尔数据成员时会发生奇怪的事情

时间:2012-08-20 08:14:35

标签: .net serialization protocol-buffers protobuf-net

当序列化具有内联初始化为true的布尔成员的类型时 - 我总是在对象的反序列化时得到值为true(显然,问题是在序列化之前成员的实际值为false时) 。 在相反的情况下不会发生这种情况(内联初始化为false,对象值为true - 我也尝试过其他操作和其他数据成员类型,它们都可以正常工作)。

这里是类型:

[ProtoContract]
public class SomeObject
{
    public SomeObject() {}

    [ProtoMember(1)]
    private bool m_SomeMember = true;

    public bool SomeMember
    {
        get { return m_SomeMember; }
        set { m_SomeMember = value; }
    }
}

这是代码:

var stream = new MemoryStream();
var data = new SomeObject() {SomeMember = false};
Serializer.SerializeWithLengthPrefix<SomeObject>(stream, data , PrefixStyle.Base128);
stream.Position = 0;
var deserializedObject = Serializer.DeserializeWithLengthPrefix<SomeObject>(stream, PrefixStyle.Base128);

在查看deserializied对象的值时 - SomeMember值为true。 这没有多大意义,因为内联成员初始化代码应该由编译器插入到默认的ctor中 - 据我所知,protobuf应该只在调用ctor之后设置成员的值(不要认为它)是否可能)所以,帮助? (马克?)

1 个答案:

答案 0 :(得分:1)

默认情况下,protobuf-net使用隐式零默认值(false被视为零)。你可以告诉它你的意思:

[ProtoMember(1), DefaultValue(true)]
private bool m_SomeMember = true;

或者你可以(通过RuntimeTypeModel.UseImplicitZeroDefaults)禁用此行为,以便只处理显式默认值。