2009-09-29 11 views
5

Durante el uso de protobuf-Net y la serialización de una propiedad enum, donde la enumeración está ajustado en [FlagsAttribute], I recibió el siguiente mensaje de error al serializar un valor de enumeración compuesta de múltiples banderas.de error durante el uso de protobuf-Net con banderas enum

El error es: El valor (MyEnum.MyValue) no tiene alambre de representación para MyProperty propiedad

Dónde MyEnum es:

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

y

MyProperty = MyEnum.MyValue2 | MyEnum.MyValue4; 

parece ser un error en protobuf-net?

+0

Ahora fija en R274; véase la respuesta actualizada –

Respuesta

4

Actualización: esto ahora se fija en r274; se debería utilizar:

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

última instancia, el formato de búferes de protocolo de alambre no ofrece ninguna posibilidad de [Banderas] enumeraciones - hace cumplir los valores de enumeración contra el conjunto discreto. Podría permitir que esta facilidad es lo suficiente bueno, pero:

  • que probablemente tendría que desactivar las asignaciones de enumeración en este caso, o hacer un montón de trabajo de bits fea juego
  • no sería estrictamente compatibles

una forma más fácil de hacer esto puede ser hacer una cuña en el código:

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

la otra alternativa sería añadir una bandera que funciona como el anterior en su nombre; tratándolo como un int en lugar de una enumeración.

+0

Gracias por tomarse el tiempo para responder. Yo preferiría la última alternativa en la que me gustaría poner una bandera para el atributo ProtoMember para indicar que la enumeración debe ser tratado como un int. –

+0

Muchas gracias por la corrección! –

Cuestiones relacionadas