当序列化具有被内联初始化为true的 bool 成员的类型时,在对象反序列化时,我总是将值设为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);

在查看反序列化对象的值时-SomeMember值为true。
这没有多大意义,因为内联成员初始化代码应由编译器插入默认的ctor中;据我所知,protobuf应该仅在ctor被调用后才设置成员的值(不要认为否则可能),那么,帮助吗? (马克?)

最佳答案

默认情况下,protobuf-net使用隐式零默认值(而false被视为零)。您可以说出您的意思:

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

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

关于.net - 使用内联初始化反序列化 bool 数据成员时发生奇怪的事情,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12034269/

10-16 08:06