使用带有标志枚举的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而不是一个枚举。