2009-09-29 47 views
5

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

的错误是:该值(MyEnum.MyValue)具有用于属性myProperty的无线表示

MyEnum是:

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

MyProperty = MyEnum.MyValue2 | MyEnum.MyValue4; 

似乎成为protobuf网络中的错误?

+0

现在固定在r274;查看更新的答案 – 2009-10-09 18:31:37

回答

4

更新:现已修复为r274;你可以使用:

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

最终协议缓冲区线 格式不提供[国旗]枚举任何范围 - 它强制枚举值对 谨慎集。我可以让这个容易enugh,但:

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

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

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

另一种方法是补充,就像上面您01标志代表;将其视为一个整数而不是枚举。

+0

感谢您花时间回复。我更喜欢最后一种选择,我会在ProtoMember属性中放置一个标志来指示该枚举应该被视为一个int。 – 2009-09-30 11:21:36

+0

非常感谢您的修复! – 2009-10-13 11:24:44