sql >> Database >  >> NoSQL >> MongoDB

BsonSerializationException bij het serialiseren van een Dictionary naar BSON

Het probleem is dat het nieuwe stuurprogramma woordenboeken standaard als een document rangschikt.

Het MongoDB C#-stuurprogramma heeft 3 manieren om een ​​woordenboek te serialiseren:Document , ArrayOfArrays &ArrayOfDocuments (meer daarover in de documenten). Wanneer het als een document wordt geserialiseerd, zijn de woordenboeksleutels de namen van het BSON-element dat enkele beperkingen heeft (bijvoorbeeld, zoals de fout suggereert, moeten ze worden geserialiseerd als tekenreeksen).

In dit geval zijn de sleutels van het woordenboek DateTime s die niet geserialiseerd zijn als strings, maar als Date s dus we moeten een andere DictionaryRepresentation kiezen .

Om de serialisatie van deze specifieke eigenschap te wijzigen, kunnen we de BsonDictionaryOptions . gebruiken attribuut met een andere DictionaryRepresentation :

[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfArrays)]
public Dictionary<DateTime, int> Dictionary { get; private set; }

We moeten dat echter voor elk problematisch lid afzonderlijk doen. Om deze DictionaryRepresentation toe te passen aan alle relevante leden kunnen we een nieuwe conventie implementeren:

class DictionaryRepresentationConvention : ConventionBase, IMemberMapConvention
{
    private readonly DictionaryRepresentation _dictionaryRepresentation;
    public DictionaryRepresentationConvention(DictionaryRepresentation dictionaryRepresentation)
    {
        _dictionaryRepresentation = dictionaryRepresentation;
    }
    public void Apply(BsonMemberMap memberMap)
    {
        memberMap.SetSerializer(ConfigureSerializer(memberMap.GetSerializer()));
    }
    private IBsonSerializer ConfigureSerializer(IBsonSerializer serializer)
    {
        var dictionaryRepresentationConfigurable = serializer as IDictionaryRepresentationConfigurable;
        if (dictionaryRepresentationConfigurable != null)
        {
            serializer = dictionaryRepresentationConfigurable.WithDictionaryRepresentation(_dictionaryRepresentation);
        }

        var childSerializerConfigurable = serializer as IChildSerializerConfigurable;
        return childSerializerConfigurable == null
            ? serializer
            : childSerializerConfigurable.WithChildSerializer(ConfigureSerializer(childSerializerConfigurable.ChildSerializer));
    }
} 

Die we als volgt registreren:

ConventionRegistry.Register(
    "DictionaryRepresentationConvention",
    new ConventionPack {new DictionaryRepresentationConvention(DictionaryRepresentation.ArrayOfArrays)},
    _ => true);


  1. Gebruik redis om een ​​realtime chat op te bouwen met socket.io en NodeJs

  2. MongoDB-omgeving instellen | Installeer MongoDB op Windows

  3. Redis-ondersteunde ASP.NET SessionState-provider

  4. best practice van django + PyMongo pooling?