Проблемът е, че новият драйвер сериализира речниците като документ по подразбиране.
Драйверът на 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);