Deserialisierungsfeld, wenn der Typ mit dem MongoDb csharp-Treiber geändert wird

8

Ich teste eine Reihe von Szenarien mit MongoDb, um zu sehen, wie ich von möglichen Datenproblemen wiederherstellen kann.

Ich habe Klassen (Adressen mit einer Adressensammlung) mit einer Postleitzahleigenschaft in Adresse, die ursprünglich als Zeichenfolge umgewandelt wurde. Ich habe mehrere Datensätze von Adressen gespeichert und konnte sie alle gut abrufen. so was, var allAddresses = Adressen.FindAllAs ();

Ich habe die Postleitzahleigenschaft in int geändert und einige Datensätze gespeichert. Ich habe dann die Postleitzahl-Eigenschaft zurück in String geändert.

Wenn ich versuche, die Sammlung zurück zu lesen, bekomme ich wie erwartet eine Deserialisierung des Fehlers. var allAddresses = Adressen.FindAllAs ();

Mein Ziel ist es, die Deserialisierung überschreiben zu können. Wenn ein Fehler bei der Felddeserialisierung auftritt, kann ich entweder ignorieren oder einen Standardwert anwenden.

Ich habe einen benutzerdefinierten Serializer ausprobiert, der nicht funktioniert. Irgendwelche Vorschläge würden geschätzt werden.

%Vor%     
user1329380 12.04.2012, 14:46
quelle

1 Antwort

9

Es gibt ein paar Dinge, die vor sich gehen. Das wichtigste ist, dass Sie die Eingabe unabhängig vom Typ konsumieren müssen oder dass der Deserialisierungsprozess nicht mehr synchron ist. Ich habe Ihr Szenario getestet, indem ich einen benutzerdefinierten Serializer namens ZipCodeSerializer geschrieben habe, der Nullen verarbeitet und ZipCodes als Zeichenfolgen schreibt, aber bei der Eingabe entweder String oder Ints akzeptiert und die Ints in Zeichenfolgen konvertiert.

Ich habe diese Klasse zum Testen verwendet:

%Vor%

Und das ist der benutzerdefinierte Serialisierer, den ich geschrieben habe:

%Vor%

Sie müssen sicherstellen, dass der benutzerdefinierte Serializer angeschlossen ist, was Sie folgendermaßen tun können:

%Vor%

Nun wird das ZipCode-Feld der Address-Klasse vom benutzerdefinierten Serializer behandelt.

Ich habe einige Testdaten mit BsonDocument erstellt, um bestimmte gespeicherte Versionen der Daten in meiner Testsammlung einfach zu erzwingen:

%Vor%

Hier sehen Sie, wie die Dokumente mit der Mongo-Shell aussehen:

%Vor%

Also sehen wir, dass einige ZipCodes Strings sind und einige sind Ints (es gibt auch einen Null-Wert).

Und das ist mein Testcode:

%Vor%

Und die Ausgabe des Testcodes ist:

%Vor%

Beachten Sie, dass die Postleitzahl, die ein int in der Datenbank war, jetzt eine Zeichenfolge ist.

Der vollständige Quellcode meines Testprogramms ist verfügbar unter:

Ссылка

    
Robert Stam 12.04.2012 17:43
quelle

Tags und Links