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

Sté*_*écy 5 c# protobuf-net

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

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

MyEnum在哪里:

[Flags]
public Enum MyEnum
{
    MyValue = 0,
    MyValue1 = 1,
    MyValue2 = 2,
    MyValue4 = 4,
    MyValue8 = 8,
}
Run Code Online (Sandbox Code Playgroud)

MyProperty = MyEnum.MyValue2 | MyEnum.MyValue4;
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ell 5

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

[ProtoMember(12, DataFormat = DataFormat.TwosComplement)]
public MyEnum MyValue {get;set;}
Run Code Online (Sandbox Code Playgroud)

最终,协议缓冲区有线格式不为 [Flags] 枚举提供任何范围 - 它针对谨慎的集合强制执行枚举值。我可以很容易地做到这一点,但是:

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

一个更简单的方法可能是在你的代码中做一个垫片:

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

另一种选择是代表您添加一个与上述类似的标志;将其视为 int 而不是枚举。