MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

BsonSerializationException saat membuat serial Dictionary ke BSON

Masalahnya adalah driver baru membuat kamus bersambung sebagai dokumen secara default.

Driver MongoDB C# memiliki 3 cara untuk membuat kamus bersambung:Document , ArrayOfArrays &ArrayOfDocuments (lebih lanjut tentang itu di dokumen). Ketika bersambung sebagai dokumen, kunci kamus adalah nama elemen BSON yang memiliki beberapa batasan (misalnya, seperti yang disarankan kesalahan, mereka harus diserialisasi sebagai string).

Dalam hal ini, kunci kamus adalah DateTime s yang tidak diserialisasi sebagai string, tetapi sebagai Date jadi kita perlu memilih DictionaryRepresentation yang lain .

Untuk mengubah serialisasi properti khusus ini, kita dapat menggunakan BsonDictionaryOptions atribut dengan DictionaryRepresentation yang berbeda :

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

Namun, kita perlu melakukan itu pada setiap anggota yang bermasalah secara individual. Untuk menerapkan DictionaryRepresentation ini untuk semua anggota yang relevan, kami dapat menerapkan konvensi baru:

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

Yang kami daftarkan sebagai berikut:

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. Pengumpulan kunci Mongodb hingga bendera disetel?

  2. MongoDB $mul

  3. Hapus kunci dari dokumen MongoDB menggunakan Mongoose

  4. Pengembangan Basis Data Python dan MongoDB

  5. Cara menggunakan Spring untuk terhubung ke MongoDB yang memerlukan otentikasi