2009-09-29 8 views
5

Durante l'utilizzo di ProtoBuf-Net e la serializzazione di una proprietà enum, in cui l'enum è impostato su [FlagsAttribute], ho ricevuto il seguente messaggio di errore durante la serializzazione di un valore enum composto da più flag.Errore durante l'utilizzo di ProtoBuf-Net con flag enum

L'errore è: Il valore (MyEnum.MyValue) non ha wire-rappresentazione di struttura MyProperty

Dove MyEnum è:

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

e

MyProperty = MyEnum.MyValue2 | MyEnum.MyValue4; 

sembra essere un bug in protobuf-net?

+0

Ora fissato in r274; guarda la risposta aggiornata –

risposta

4

Aggiornamento: ora risolto in r274; si usa:

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

In definitiva il buffer di protocollo filo formato non prevede alcuna possibilità di [flags] enumerazioni - si fa rispettare valori enum contro il set discreto. Ho potuto permettere che questo facilmente enugh, ma:

  • avrei probabilmente dovuto disabilitare mappature enum in questo caso, o di fare un sacco di brutti bit-lavoro corrispondenza
  • non sarebbe strettamente compatibili

un modo più semplice di fare questo potrebbe essere quella di fare uno spessore nel codice:

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

l'altra alternativa sarebbe quella di aggiungere un flag che funziona come il precedente sul nome; trattandolo come un int piuttosto che un enum.

+0

Grazie per aver trovato il tempo di rispondere. Preferirei l'ultima alternativa dove metterei un flag all'attributo ProtoMember per indicare che l'enum dovrebbe essere trattato come un int. –

+0

Grazie mille per la correzione! –

Problemi correlati