2009-09-29 6 views
5

Lors de l'utilisation Protobuf-Net et sérialisation une propriété ENUM, où le ENUM est réglé sur [FlagsAttribute], j'ai reçu le message d'erreur suivant lors de la sérialisation une valeur ENUM composée de plusieurs drapeaux.Erreur lors de l'utilisation Protobuf-Net avec des drapeaux ENUM

L'erreur est: La valeur (MyEnum.MyValue) n'a pas de fil-représentation de la propriété MyProperty

Lorsque MyEnum est:

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

et

MyProperty = MyEnum.MyValue2 | MyEnum.MyValue4; 

Semble être un bug dans protobuf-net?

+0

Maintenant fixé en r274; voir la mise à jour –

Répondre

4

Mise à jour: ceci est maintenant corrigé dans r274; vous utiliseriez:

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

En fin de compte les tampons de protocole le format fil ne fournit aucune portée pour [] Drapeaux énumérations - il applique les valeurs enum contre l'ensemble discret. Je pouvais permettre cela facilement enugh, mais:

  • Je devrais probablement désactiver les correspondances enum dans ce cas, ou faire beaucoup de laid BIT- travail correspondant
  • il ne serait pas strictement compatible

un moyen plus facile de le faire peut-être faire une cale dans votre code:

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

l'autre alternative serait d'ajouter un drapeau qui fonctionne comme ci-dessus sur votre nom; le traiter comme un int plutôt que d'enum.

+0

Merci d'avoir pris le temps de répondre. Je préférerais la dernière alternative où je mettrais un drapeau à l'attribut ProtoMember pour indiquer que l'enum devrait être traité comme un int. –

+0

Merci beaucoup pour la correction! –

Questions connexes