Problemet er, at den nye driver serialiserer ordbøger som et dokument som standard.
MongoDB C#-driveren har 3 måder at serialisere en ordbog på:Dokument
, ArrayOfArrays
&ArrayOfDocuments
(mere om det i dokumenterne). Når det serialiseres som et dokument, er ordbogsnøglerne navnene på BSON-elementet, som har nogle begrænsninger (for eksempel, som fejlen antyder, skal de serialiseres som strenge).
I dette tilfælde er ordbogens nøgler DateTime
s, som ikke er serialiseret som strenge, men som Dato
så vi skal vælge en anden Ordbogsrepræsentation
.
For at ændre serialiseringen af denne specifikke egenskab kan vi bruge BsonDictionaryOptions
attribut med en anden Ordbogsrepræsentation
:
[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfArrays)]offentlig ordbog Ordbog { get; privat sæt; }
Vi skal dog gøre det for hvert problematisk medlem individuelt. For at anvende denne Ordbogsrepræsentation
til alle de relevante medlemmer kan vi implementere en ny konvention:
klasse DictionaryRepresentationConvention :ConventionBase, IMemberMapConvention{ privat skrivebeskyttet Dictionary Representation _dictionaryRepresentation; public DictionaryRepresentationConvention(DictionaryRepresentation dictionaryRepresentation) { _dictionaryRepresentation =ordbogsrepræsentation; } public void Apply(BsonMemberMap memberMap) { memberMap.SetSerializer(ConfigureSerializer(memberMap.GetSerializer())); } private IBsonSerializer ConfigureSerializer(IBsonSerializer serializer) { var dictionaryRepresentationConfigurable =serializer som IDictionaryRepresentationConfigurable; if (dictionaryRepresentationConfigurable !=null) { serializer =dictionaryRepresentationConfigurable.WithDictionaryRepresentation(_dictionaryRepresentation); } var childSerializerConfigurable =serializer som IChildSerializerConfigurable; return childSerializerConfigurable ==null ? serializer :childSerializerConfigurable.WithChildSerializer(ConfigureSerializer(childSerializerConfigurable.ChildSerializer)); }}
Hvilket vi registrerer som følger:
ConventionRegistry.Register( "DictionaryRepresentationConvention", ny ConventionPack {new DictionaryRepresentationConvention(DictionaryRepresentation.ArrayOfArrays)}, _ => sand);