2016-05-02 57 views
0

私はいくつかの辞書でモデルを持っています。 C#ドライバでmongoDBに挿入しようとすると、次のメッセージで例外が発生します。 DictionaryRepresentation.Documentキー値を使用する場合、文字列としてシリアル化する必要があります。MongoDB serialize Dictionary <MyEnum、object>

もちろん、[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfArrays)]属性を追加できますが、それは機能しますが、列挙型として永続化できるようにします。

public MyEnum { 
    A, 
    B 
} 

[BsonDictionaryOptions(DictionaryRepresentation.Document)] 
public Dictionary<MyEnum, object> MyData { get; set; } 

私が持っていたいさまざまな理由からモンゴのようなものです。

{ 
    "MyData": { 
     "B": "xxxx", 
     "A": "xxxx" 
    } 
} 

は、単一の列挙のために、私はちょうど[BsonRepresentation(BsonType.String)]属性を使用することができますが、辞書は、文字列として列挙型のキーをシリアル化するためにどのようにドライバーに伝えるために?

+0

'public Dictionary MyData {get;セット; } 'そして、' MyEnum.A.toString() 'を渡すか、またはintegerを使用します。 –

+0

ありがとう、私はすでにそれについて考えたが、私は簡単に追加できる一般的な属性を探しているが、私はそれを行うことができるか、コンビニエンスパックを知らない。 – Demonia

答えて

0

この回答はコメントには長すぎますが、コメントを参照しています。

これは、プログラムの実行中にこのオブジェクトのタイプを変更する必要があります。最初はこれは非常に悪い考えです。これは非常に遅いでしょう。

私はあなたがこの目的のために、あなたの辞書の実装を使用するか、または拡張クラスを使用することをお勧めします。

public MyEnum { 
    A, 
    B 
} 

[BsonDictionaryOptions(DictionaryRepresentation.Document)] 
public MyDictionary<String, MyEnum, object> MyData {get;set;} 

public class MyDictionary<T1,T2,T3> : IDictionary{ 
    Dictionary<T1, T3> Dict = new Dictionary<T1, T3>(); 
    //implement dictionary... 
} 
public static class ExtentionsDictionary<T1,T2>{ 
    public static T2 Get(this IDictionary dict, MyEnum enum){ 
    var key = enum.ToString(); 
    return dict[key]; 
    } 
    //Rest of the implementation 
} 
+0

インターロッキングアプローチ。私はこれを楽に適応させることができると思う。ありがとうございました。 – Demonia

1

問題は辞書シリアライザは、文字列型であることを、キーを強制しないことです。 これを回避するには、独自のシリアライザを作成し、BsonSerializer属性を使用して選択します。

public class EnumDictionarySerializer<TKey, TDictionary> : DictionarySerializerBase<TDictionary> 
    where TKey : struct 
    where TDictionary : class, IDictionary, new() 
{ 
    public EnumDictionarySerializer():base(DictionaryRepresentation.Document, new EnumSerializer<TKey>(BsonType.String), new ObjectSerializer()) 
    { 

    } 

    protected override TDictionary CreateInstance() 
    { 
     return new TDictionary(); 
    } 
} 
関連する問題