Ich habe eine Sammlung in meiner Datenbank, wo ich Ereignisse protokollieren. Jeder Ereignistyp hat einen anderen Datensatz. Ich habe dies mit folgender Klasse definiert:C# MongoDb Serialisierung von Dictionary <String, Objekt>
[CollectionName("LogEvent")]
public class LogEvent
{
public LogEvent(string eventType)
{
EventType = eventType;
EventData = new Dictionary<string, object>();
}
public string EventType { get; private set; }
[BsonExtraElements]
public IDictionary<string, object> EventData { get; private set; }
}
Jetzt - das funktioniert ziemlich gut in gewissem Maße. Solange die Elemente des EventData
Wörterbuch sind einfache Typen ...
var event = new LogEvent("JobQueues"){
EventData = new Dictionary<string, object>(){
{ "JobId": "job-123" },
{ "QueueName": "FastLane" }
}
}
_mongoCollection.InsertOne(event);
... ich Mongo Dokumente wie
{
_id: ObjectId(...),
EventType: "JobQueued",
JobId: "job-123",
QueueName: "FastLane"
}
Aber sobald ich versuche, einen benutzerdefinierten Typ der hinzufügen Wörterbuch, Dinge funktionieren nicht mehr.
var event = new LogEvent("JobQueues"){
EventData = new Dictionary<string, object>(){
{ "JobId": "job-123" },
{ "QueueName": "FastLane" },
{ "JobParams" : new[]{"param-1", "param-2"}},
{ "User" : new User(){ Name = "username", Age = 10} }
}
}
Das gibt mir Fehler wie ".NET type ... cannot be mapped to BsonType."
Wenn ich den [BsonExtraElements]
Tag zu entfernen, und [BsonDictionaryOptions(DictionaryRepresentation.Document)]
Es wird serialize Sachen ohne Fehler starten, aber es gibt mir ein ganz anderes Dokument, das Ich mag es nicht. .
{
_id: ObjectId(...),
EventType: "JobQueued",
EventData: {
JobId: "job-123",
QueueName: "FastLane",
User: {
_t: "User",
Name: "username",
Age: 10
},
JobParams : {
_t: "System.String[]",
_v: ["param-1", "param-2"]
}
}
}
Was ich will, ist das folgende Ergebnis:
{
_id: ObjectId(...),
EventType: "JobQueued",
JobId: "job-123",
QueueName: "FastLane",
User: {
Name: "username",
Age: 10
},
JobParams : ["param-1", "param-2"]
}
Weiß jemand, wie man das erreicht?
(Ich verwende den C# mongodriver v2.3)
Deserialisierung ist kein Problem . Dies ist eine "nur Anhängen" -Sammlung, und in dem seltenen Zustand, in dem etwas zurückgelesen wird, wird es durch benutzerdefinierte Projektionen geschehen. Anyway - benutzerdefinierte Serialisierer ist keine gute Option, da ein Punkt davon ist in der Lage, "was auch immer" zum Protokoll hinzuzufügen. – Vegar
Ich hatte eine Art Workaround, indem ich die Daten zuerst als json mit json.net serialisierte und dann mongo bat, ein bsondocument des json zu erstellen. Es hat irgendwie funktioniert, aber keine optimale Lösung ... – Vegar
@Vegar Vielleicht ist Ihr Workaround die beste Lösung. MongoDrive könnte alles, was zur Sammlung gehört, hinzufügen, aber es sollte sicher sein, dass es möglich ist, es genau in der Sam-Form zurückzubekommen, und dafür werden Typedeskriptoren verwendet. –