MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

BsonSerializationException при сериализиране на речник към BSON

Проблемът е, че новият драйвер сериализира речниците като документ по подразбиране.

Драйверът на MongoDB C# има 3 начина за сериализиране на речник:Document , ArrayOfArrays &ArrayOfDocuments (повече за това в документите). Когато се сериализира като документ, ключовете на речника са имената на елемента BSON, който има някои ограничения (например, както подсказва грешката, те трябва да бъдат сериализирани като низове).

В този случай ключовете на речника са DateTime s, които не се сериализират като низове, а като Date s така че трябва да изберем друго DictionaryRepresentation .

За да променим сериализацията на това конкретно свойство, можем да използваме BsonDictionaryOptions атрибут с различен DictionaryRepresentation :

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

Трябва обаче да направим това за всеки проблемен член поотделно. За да приложите това DictionaryRepresentation за всички съответни членове можем да приложим нова конвенция:

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

Които регистрираме, както следва:

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Маскиране на PII в MongoDB и други NoSQL DB чрез…

  2. Как да разположите MongoDB на Heroku

  3. Заявете MongoDB с $and и Множество $or

  4. Как да изпълня командата mongodump програмно от node.js?

  5. Mongo групово намиране и актуализиране на полето за съответстващи документи в една заявка?