Het probleem is dat het nieuwe stuurprogramma woordenboeken standaard als een document rangschikt.
Het MongoDB C#-stuurprogramma heeft 3 manieren om een woordenboek te serialiseren:Document
, ArrayOfArrays
&ArrayOfDocuments
(meer daarover in de documenten). Wanneer het als een document wordt geserialiseerd, zijn de woordenboeksleutels de namen van het BSON-element dat enkele beperkingen heeft (bijvoorbeeld, zoals de fout suggereert, moeten ze worden geserialiseerd als tekenreeksen).
In dit geval zijn de sleutels van het woordenboek DateTime
s die niet geserialiseerd zijn als strings, maar als Date
s dus we moeten een andere DictionaryRepresentation
kiezen .
Om de serialisatie van deze specifieke eigenschap te wijzigen, kunnen we de BsonDictionaryOptions
. gebruiken attribuut met een andere DictionaryRepresentation
:
[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfArrays)]
public Dictionary<DateTime, int> Dictionary { get; private set; }
We moeten dat echter voor elk problematisch lid afzonderlijk doen. Om deze DictionaryRepresentation
toe te passen aan alle relevante leden kunnen we een nieuwe conventie implementeren:
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));
}
}
Die we als volgt registreren:
ConventionRegistry.Register(
"DictionaryRepresentationConvention",
new ConventionPack {new DictionaryRepresentationConvention(DictionaryRepresentation.ArrayOfArrays)},
_ => true);