Dictionary<string, object> zu BsonDocument Konvertierung weglassen _t-Bereich
Ich bin mit ToBsonDocument
Erweiterung Methode von MongoDB.Bson
zu konvertieren, das Wörterbuch:
var dictionary = new Dictionary<string, object> {{"person", new Dictionary<string, object> {{"name", "John"}}}};
var document = dictionary.ToBsonDocument();
Und hier ist das resultierende Dokument:
{ "person" :
{ "_t" : "System.Collections.Generic.Dictionary`2[System.String,System.Object]",
"_v" : { "name" : "John" } } }
Gibt es einen Weg, um loszuwerden, diese _t/_v Zeug? Ich möchte das resultierende Dokument wie folgt Aussehen:
{ "person" : { "name" : "John" } }
UPD: ich habe der code in DictionaryGenericSerializer:
if (nominalType == typeof(object))
{
var actualType = value.GetType();
bsonWriter.WriteStartDocument();
bsonWriter.WriteString("_t", TypeNameDiscriminator.GetDiscriminator(actualType));
bsonWriter.WriteName("_v");
Serialize(bsonWriter, actualType, value, options); //recursive call replacing nominalType with actualType
bsonWriter.WriteEndDocument();
return;
}
So, es scheint, dass es nicht allzu viele Möglichkeiten mit diesem serializer, wenn der Werttyp ist object
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du sollst zuerst serialisieren zu JSON und dann zu BSON,
Ist geschehen, weil Sie geben Sie
object
geben Sie für die Wörterbuch-Werte, sondern verwenden SieDictionary<string, object>
geben Sie für den bestimmten Datensatz Wert. Daher, CSharp-Treiber speichert den vollständigen Namen des konkreten Typs deserialisiert werden in diesem Dokument richtig in Zukunft. Sie können auch Lesen Sie mehr über es hier: Serialisieren von Dokumenten mit der CSharp-Treiber: Polymorphe Klassen und ModulationsumwandlerZur Erreichung des gewünschten Ergebnisses sollten Sie den konkreten Typ für die Wörterbuch-Werte:
string
Wert oder einem anderenDictionary
. Es scheint also, dass kann ich nicht verwenden alles andere alsobject
für den Typ. Kann ich irgendwie den Fahrer bitten, um dasselbe Verhalten in einem solchen Fall?Einfach eine Umwandlung von Objekt zu BSON ist schwierig.
Gehen, statt von Objekt --> Json --> Bson
Gehen aus .NET-Objekte für JSON, BSON, während gleichzeitig die Vermeidung _t/_v Codierung, führt zum Verlust der Typ-Informationen für Termine und andere BSON-spezifische Typen.
Die Lösung, die ich gefunden habe für die Vermeidung _t/_v, während die Erhaltung der BSON-Arten wurde ein benutzerdefinierter Wert serializer für den Fahrer gebaut-in
DictionaryInterfaceImplementerSerializer
(und Optional dieEnumerableInterfaceImplementerSerializer
auch). Ich habe die Lösung getestet für "Erweiterte JSON-generation", d.h. JSON mit speziellen syntax für die BSON-spezifische Arten, aber das Prinzip sollte das gleiche für direkte BSON-Ausgabe.Um dies zu tun, kopieren Sie zuerst den standard -
ObjectSerializer
in Ihrem C# - Projekt (und benennen Sie Sie um Unklarheiten zu vermeiden): https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Bson/Serialization/Serializers/ObjectSerializer.csNeben der Klasse umbenennen, die
private void SerializeDiscriminatedValue(BsonSerializationContext context, BsonSerializationArgs args, object value, Type actualType)
Methode auch bearbeitet werden muss. (In meinem Fall, wollte ich auch vermeiden _t/_v Codierung fürIEnumerable<object>
, die sich weiter unten.)Unter der Annahme, dass der name der kopiert und bearbeitet-Klasse
DynamicValueSerializer
verwenden Sie den folgenden code, um es zu registrieren als Wert serializer beim Start der Anwendung.Bitte beachten Sie, dass dies getan werden muss, für jeden aktuellen Typ, deren Werte verwendet werden sollen. Der serializer-Registrierung kann nicht getan werden für die Schnittstellen. Also, wenn
SortedDictionary<string, object>
oderSortedList<string, object>
behandelt werden in der gleichen Weise wieDictionary<string, object>
die Registrierung muss wiederholt werden, für diese Arten. (Dies beeinflusst, ob Wörterbücher enthaltenen Werte in Sammlungen dieser Typen wird serialisiert werden, ohne _t/_v, nicht unbedingt, ob die Objekte von den Typen, die sich selbst serialisiert in dieser Art und Weise.)Gelten die gleichen Serialisierung Prinzip
List<object>
Objekte, verwenden Sie den folgenden Registrierungscode.