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

时间:2009-09-29 21:03:08

标签: c# 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中的一个错误?

1 个答案:

答案 0 :(得分:4)

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

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

最终协议缓冲线 format不为[Flags]枚举提供任何范围 - 它强制执行枚举值 谨慎的一套。我可以轻松地允许这一点,但是:

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

更简单的方法是在代码中填写一个垫片:

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

另一种选择是在你的上面添加一个像上面那样工作的标志 代表;把它当作一个int而不是一个枚举。