2016-06-14 3 views
2
「いいえワイヤー値が列挙fooの位置16にマッピングされていない」

何が: "ワイヤ値がenum fooの位置16にマップされていません"というエラーは意味しますか?

このエラーメッセージは何を意味するのでしょうか?

  • i。)ワイヤ値とは何ですか?

  • ii。)相対的な位置は?

    追加情報:私は私の特定の状況で

ませワイヤ値があり、位置16

で列挙System.Drawing.ContentAlignment.0にマッピングされていません私が知っている整数0の列挙の表現はありません。エラーレポートの意味を知るだけで、この問題を解決する方法がわかります。

+0

"position 16"は、おそらく*出力バッファへのオフセットについて語っています。 *シリアライゼーション*のために、おそらくあなたよりも私を助けます。 *デシリアライズ*のために、それは消費者にとってより有用かもしれない –

答えて

3

"ワイヤー値"は、 "ワイヤー上"で使用するバイナリー表現、つまり基本ストリーム内で使用されます。この場合、0を使用しているということは、enumの値が0であることを意味しますが、は0を期待していませんでした。ほとんどの場合、0の値を持つenumメンバーが定義されていない可能性が高いです。それは、System.Drawing.ContentAlignment.0ではなく、その名前を使用したでしょう。 protobuf-netは、値が意味をなさないことを強制する列挙規則を適用しようとしています(また、外部データを使ったいくつかのシナリオで、列挙値と配線値の間のマップを定義することもできます)。

これを避ける方法はいくつかあります問題:

  • が存在しない列挙型の値をシリアル化しようとしないでください:欠けている列挙型をシリアル化する(またはあなたが列挙型をコントロールしている場合、欠損値を追加する)
  • 使用Nullable<SomeEnum>SomeEnum?None値、その値を表す場合
  • 0そのいるProtobufネットがenumルールを適用しようとしたことがないので、はint(または任意の基本となるタイプがある)ようなタイプを公開「シム」プロパティを使用します。

    public SomeEnum Foo {get;set;} // the actual member 
    [ProtoMember(42)] 
    private int FooSerialized { // only exists to help protobuf-net ignore the 
        get { return (int)Foo; }// invalid values that the member might contain 
        set { Foo = (SomeEnum)value; } 
    } 
    
  • 手動RuntimeTypeModel経由でモデルを設定し、伝えますEnumPassthru

  • trueにを設定することにより、このメンバーに取り扱う列挙型を無視するようにいるProtobuf-netがいるProtobuf-netの有効 EnumPassThru自動的
を行います [Flags]と列挙型の宣言を、マーク
関連する問題