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