sql >> Database teknologi >  >> NoSQL >> MongoDB

BsonSerializationException ved serialisering af en ordbog til BSON

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); 


  1. MongoDB $dateFromString Format Specifiers

  2. MongoDB Document Re-shaping

  3. installer mongoDB (underordnet proces mislykkedes, afsluttet med fejlnummer 100)

  4. Den hurtigere metode til at flytte redis-data til MySQL