使用带有标志枚举的ProtoBuf-Net时出错

在使用ProtoBuf-Net并序列化枚举属性时,枚举设置为[FlagsAttribute],在序列化由多个标志组成的枚举值时收到以下错误消息。

错误是:值(MyEnum.MyValue)没有属性MyProperty的线表示

MyEnum在哪里:

[Flags] public Enum MyEnum { MyValue = 0, MyValue1 = 1, MyValue2 = 2, MyValue4 = 4, MyValue8 = 8, } 

 MyProperty = MyEnum.MyValue2 | MyEnum.MyValue4; 

似乎是protobuf-net中的一个bug?

更新:现在已在r274中修复 ; 你会用:

 [ProtoMember(12, DataFormat = DataFormat.TwosComplement)] public MyEnum MyValue {get;set;} 

最终协议缓冲区有线格式不为[Flags]枚举提供任何范围 – 它对谨慎的集合强制执行枚举值。 我可以轻松地允许这种情况,但是:

  • 在这种情况下,我可能不得不禁用枚举映射,或者进行大量丑陋的匹配工作
  • 它不会严格兼容

更简单的方法是在代码中填充垫片:

 public MyEnum MyValue {get;set;} [ProtoMember(12)] private int MyValueWire { get {return (int)MyValue;} set {MyValue = (MyEnum)value;} } 

另一种选择是添加一个代表你的上述标志; 把它当作一个int而不是一个枚举。