views:

159

answers:

1

While using ProtoBuf-Net and serializing an enum property, where the enum is set to [FlagsAttribute], I received the following error message when serializing an enum value composed of multiple flags.

The error is: The value (MyEnum.MyValue) has no wire-representation for property MyProperty

Where MyEnum is:

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

and

MyProperty = MyEnum.MyValue2 | MyEnum.MyValue4;

Seems to be a bug in protobuf-net?

+3  A: 

Update : this is now fixed in r274; you would use:

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


Ultimately the protocol buffers wire format doesn't provide any scope for [Flags] enums - it enforces enum values against the discreet set. I could allow this easily enugh, but:

  • I'd probably have to disable enum mappings in this case, or do a lot of ugly bit- matching work
  • it would not be strictly compatible

An easier way of doing this may be to do a shim in your code:

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

The other alternative would be to add a flag that works like the above on your behalf; treating it as an int rather than an enum.

Marc Gravell
Thanks for taking the time to reply. I would prefer the last alternative where I would put a flag to the ProtoMember attribute to indicate that the enum should be treated as an int.
Stecy
Thank you very much for the fix!
Stecy