7

ProtoBuf-Netを使用し、列挙型が[FlagsAttribute]に設定されているenumプロパティをシリアル化しているときに、複数のフラグで構成される列挙型値をシリアル化すると、次のエラーメッセージが表示されました。

エラーは次のとおりです。値(MyEnum.MyValue)には、プロパティMyPropertyのワイヤ表現がありません

MyEnumは次のとおりです。

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

MyProperty = MyEnum.MyValue2 | MyEnum.MyValue4;

protobuf-netのバグのようですか?

4

1 に答える 1

5

更新:これはr274で修正されました; 使用するもの:

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

最終的に、プロトコルバッファワイヤ形式は[フラグ]列挙型のスコープを提供しません-それは目立たないセットに対して列挙型値を強制します。私はこれを簡単に十分に許可することができますが、:

  • この場合、おそらく列挙型マッピングを無効にするか、多くの醜いビットマッチング作業を行う必要があります
  • 厳密には互換性がありません

これを行う簡単な方法は、コードでシムを実行することです。

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

もう1つの方法は、あなたに代わって上記のように機能するフラグを追加することです。列挙型ではなく整数として扱います。

于 2009-09-30T11:02:51.757 に答える