MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

BsonSerializationException khi tuần tự hóa một Từ điển thành BSON

Vấn đề là trình điều khiển mới tuần tự hóa các từ điển dưới dạng tài liệu theo mặc định.

Trình điều khiển MongoDB C # có 3 cách để tuần tự hóa từ điển:Document , ArrayOfArrays &ArrayOfDocuments (thêm về điều đó trong tài liệu). Khi nó tuần tự hóa dưới dạng tài liệu, các khóa từ điển là tên của phần tử BSON có một số hạn chế (ví dụ:như lỗi gợi ý, chúng phải được tuần tự hóa dưới dạng chuỗi).

Trong trường hợp này, các khóa của từ điển là DateTime s không được tuần tự hóa dưới dạng chuỗi mà là Date Vì vậy, chúng tôi cần chọn một DictionaryRepresentation khác .

Để thay đổi cách tuần tự hóa thuộc tính cụ thể này, chúng ta có thể sử dụng BsonDictionaryOptions với một DictionaryRepresentation khác :

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

Tuy nhiên, chúng tôi cần thực hiện điều đó đối với từng thành viên có vấn đề. Để áp dụng DictionaryRepresentation này cho tất cả các thành viên có liên quan, chúng tôi có thể thực hiện một quy ước mới:

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

Chúng tôi đăng ký như sau:

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. Truy cập MongoDB từ Go

  2. Chèn Từ điển vào MongoDB với trình điều khiển c #

  3. $ nin với $ expr

  4. Làm cách nào để chỉ định Thứ tự hoặc Sắp xếp bằng trình điều khiển C # cho MongoDB?

  5. Cách cho phép tất cả các máy chủ lưu trữ trong một bản sao được đặt trong mongodb