2015-01-30 3 views
7

jestem próby zapisu „MojaKlasa” poniżej do kolekcji Mongo:Serializować słownika w „Document” reprezentacji, gdy klucz jest enum

public enum MyEnum { A, B, C }; 

public class MyClass 
{ 
    [BsonId(IdGenerator = typeof(StringObjectIdGenerator))] 
    public string Id { get; set; } 

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

public class MyOtherClass 
{ 
    public string MyProp { get; set; } 
} 

Chciałbym serializacji to za dokument , ponieważ jest to najbardziej zwięzły przedstawienie:

{ 
    _id: "12345", 
    Items: { 
     A: { 
      MyProp: "foo" 
     }, 
     B: { 
      MyProp: "bar" 
     }, 
     C: { 
      MyProp: "baz" 
     }, 
    } 
} 

silnik Mongo zgłasza wyjątek serializacji:

Podczas używania DictionaryRepresentation.Document key values ​​musi serializować jako ciągi.

Więc pomyślałem, że może mógłbym zarejestrować konwencję, aby teksty stałe serializowania jako ciągi:

var conventions = new ConventionPack(); 
conventions.Add(new EnumRepresentationConvention(BsonType.String)); 
ConventionRegistry.Register("Custom Conventions", conventions, type => type == typeof(MyClass)); 

Niestety, ten wydaje się mieć żadnego wpływu, a silnik rzuca ten sam wyjątek.

Czy istnieje jakiś sposób, aby szeregować słownika w reprezentacji dokumentu, gdy klucz jest typu enum?

+0

Chcesz serializacji 'MyEnum' jako ciąg tylko w tym konkretnym przypadku? czy wszędzie? – i3arnon

+0

@ I3arnon albo jest w porządku. – McGarnagle

Odpowiedz

7

Można to osiągnąć poprzez bezpośrednią rejestracją serializatora że serializes swojej enum jako ciąg znaków. Można skorzystać z wbudowanego w EnumSerializer klasy z BsonType.String reprezentacji:

BsonSerializer.RegisterSerializer(new EnumSerializer<MyEnum>(BsonType.String));