2009-09-29 4 views
5

Bei der Verwendung von ProtoBuf-Net und Serialisierung einer Enum-Eigenschaft, wo die Enumeration auf [FlagsAttribute] festgelegt ist, erhielt ich die folgende Fehlermeldung beim Serialisieren eines Enum-Werts aus mehreren Flags.Fehler bei der Verwendung von ProtoBuf-Net mit Flags enum

Der Fehler ist: Der Wert (MyEnum.MyValue) keine drahtDarstellung für Eigenschaft MyProperty

Wo MyEnum ist:

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

und

MyProperty = MyEnum.MyValue2 | MyEnum.MyValue4; 

scheint, ein Bug im Protobuf-Netz sein?

+0

Jetzt in r274 behoben; siehe aktualisierte Antwort –

Antwort

4

Update: Dies ist jetzt behoben in r274; Sie verwenden würden:

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

Letztlich wird der Protokollpuffer Draht Format bieten keinen Spielraum für [Flags] Aufzählungen - es Enum-Werte gegen der diskrete Satz erzwingt. Ich konnte dies erlauben leicht enugh, aber:

  • Ich würde wahrscheinlich eine Menge hässliche bit- passende Arbeit
  • es wäre nicht unbedingt kompatibel sein
  • müssen Enum-Zuordnungen in diesem Fall deaktivieren oder tun

ein einfacher Weg, dies zu tun, eine Shim in Ihrem Code zu tun sein kann:

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

die andere Alternative wäre ein Flag hinzuzufügen, die auf 01, wie das oben funktioniertNamen; behandle es eher als int als als enum.

+0

Danke, dass Sie sich die Zeit nehmen zu antworten. Ich würde die letzte Alternative bevorzugen, bei der ich dem ProtoMember-Attribut ein Flag hinzufügen würde, um anzuzeigen, dass die Enumeration als int behandelt werden soll. –

+0

Vielen Dank für die Lösung! –