在Proto-Buf中使用bool类型

Rak*_*esh 2 c# protobuf-net

我在我的应用程序中使用protobuf-net进行序列化/反序列化.我正面临一个问题.

[ProtoContract()]
ClsTest
{
    private bool _isPeriodic

    [ProtoMember(1)]
    public bool IsPeriodic
    {
        get
        {
             return _isPeriodic;
        }

        set
        {
            isPeriodic = value;
        }
   }

}
Run Code Online (Sandbox Code Playgroud)

我在我的collction对象中使用这个类.

序列化过程工作正常,但在反序列化后,默认情况下,属性IsPeriodic的值为true,尽管在某些情况下它是错误的.谁能帮我?

Mar*_*ell 6

我的猜测是,你的代码设置IsPeriodictrue默认new情况下,也许是:

private bool _isPeriodic = true;
Run Code Online (Sandbox Code Playgroud)

或者,在构造函数中,您有:

_isPeriodic = true; // or IsPeriodic = true
Run Code Online (Sandbox Code Playgroud)

基本上,有一个隐式默认值(遵循protobuf语言指南)where-by bool被假定为默认值false.它不会发送被认为是默认值的数据.如果此默认值不正确,请告诉它:

[ProtoMember(1), DefaultValue(true)]
Run Code Online (Sandbox Code Playgroud)

或IIRC你可以尝试设置IsRequiredtrue代替:

[ProtoMember(1, IsRequired = true)]
Run Code Online (Sandbox Code Playgroud)

并且还有一些其他方法可以告诉它始终发送值:

private bool ShouldSerializeIsPeriodic() { return true;}
Run Code Online (Sandbox Code Playgroud)

(使用由核心.NET支持的模式相同PropertyGrid,XmlSerializer,PropertyDescriptor,等-这是不是我发明了随机模式)

请注意,在"v2"中,我进行了两次更改以帮助消除这种奇怪之处:

  • 您可以选择绕过构造函数(WCF样式)
  • 新的元模型提供了一种决定是否采用默认的方法