Zeitweilige Fehler beim Deinserialisieren von Objekten aus XML

8

Ich habe ein Programm, das Objekte, die als XML gespeichert sind, in eine Datenbank (im Grunde eine Nachrichtenwarteschlange) aufnimmt und sie deserialisiert. Zwischenzeitlich erhalte ich einen der folgenden Fehler:

%Vor%

Oder ich werde diesen bekommen:

%Vor%

Das Programm verarbeitet Tausende von Nachrichten pro Tag erfolgreich, aber ich bekomme diese Fehler nur 2 oder 3 Mal am Tag. Sie scheinen nicht mit einer bestimmten Art von Nachricht zu korrelieren, sondern völlig zufällig.

Irgendeine Idee, was diese Fehler verursacht und wie man sie behebt?

ETA - Hier ist der Code, der die Fehler verursacht, falls das hilft:

%Vor%     
Eric Petroelje 25.01.2011, 13:20
quelle

4 Antworten

9

Sie können Serialisierer vorkonfigurieren: Ссылка Just Versuche es. Der nächste kanonische Kandidat für solche Probleme ist Ihr Virenscanner. Ihr Werkzeug schreibt während der Erstellung von Serialisern auf die Disc. Ich habe gesehen, dass der Virenscanner in solchen Situationen alle möglichen seltsamen Fehler erzeugt hat.

    
Achim 06.06.2011, 18:04
quelle
1

XmlSerializer ist vermutlich um Thread-sicher zu sein.

Auch wenn dies der Fall ist, können Sie feststellen, dass das Verhalten in beiden Fällen fehlschlägt: XmlSerializer..ctor(Type type)

Angesichts dessen sieht es ernsthaft wie eine Multi-Threading-Beschränkung aus, die versucht, Serialisierer zu erstellen.

Ich schlage vor, diesen Code zu verwenden, den Sie haben:

%Vor%

Und implementieren Sie eine Sperre für das Hinzufügen. Auf diese Weise erstellen Sie jeweils nur einen Serializer. Der Treffer ist klein, wenn Sie nicht Tonnen verschiedener Arten verarbeiten.

Beachten Sie, dass Sie die Sperre trotzdem benötigen, da Sie doppelte Ausnahmen erhalten könnten, wenn zwei Typen gleichzeitig hinzugefügt werden sollen.

%Vor%

Wenn das Obige immer noch nicht genug ist, würde ich mit einer Lese- / Schreibsperre auf Serializer-Konstruktor vs. Serializer-Verwendung versuchen. Denkweise ist, dass das Multithreading-Problem vielleicht mehr als 2 Ctors gleichzeitig laufen lässt.

Alles oben ist eine große Vermutung, aber wenn ich es wäre würde ich definitiv bestätigen, dass das nicht ist.

    
eglasius 06.06.2011 17:57
quelle
0

Dies ist ein Zeichen dafür, dass Sie Ihre Serialisierer nicht zwischenspeichern, was überhaupt nicht gut ist = & gt; es führt zu Speicherverlust und ich vermute, dass Sie dies erfahren werden.

Denken Sie daran, dass .NET Code generiert und in jedes Mal kompiliert, wenn Sie einen Serialiser erstellen.

Erstellen Sie immer Ihre Serialisierer und cachen Sie sie anschließend.

Hier ist ein Beispiel:

%Vor%     
Aliostad 25.01.2011 13:25
quelle
0

Für den ersten Fehler (ein Programm kann nicht ausgeführt werden) wird möglicherweise dasselbe Fehler XmlSerializer , auf den wir gestoßen sind. Es stellt sich heraus, dass XmlSerlializer diese Ausnahme auslöst, wenn Directory.CurrentDirectory auf einen Ordner eingestellt ist, der nicht mehr existiert.

Unsere spezifische Situation ist anders als Ihre, aber ich werde die Details geben, falls es hilft, herauszufinden, was für Sie passieren könnte, oder es hilft anderen. In unserem Fall würde eine kleine Anzahl unserer Kunden diesen Fehler erhalten, nachdem sie unsere WinForms-Anwendung direkt vom Installer gestartet haben, d. H. Sie haben nach der Installation oder dem Upgrade die Option "Jetzt ausführen" gewählt. (Unklar, warum es einigen aber nicht anderen passiert ist). Was wir vermuten, ist, dass unser Installer (InstallAware) gelegentlich unsere Anwendung startet, wobei das aktuelle Verzeichnis auf einen Ordner eingestellt ist, der nicht mehr existiert oder gerade gelöscht wird. Um diese Theorie zu testen, schrieb ich eine Test-App, die das Starten vom Installer simuliert:

%Vor%

Sobald die gestartete Anwendung eine neue Instanz von XmlSerializer erstellt hat, wurde die Ausnahme ausgelöst. Ich habe Trace-Anweisungen eingefügt, um das Ergebnis von GetCurrentDirectory () anzuzeigen, und tatsächlich wurde es auf den Ordner WillBeDeleted gesetzt. Die Fehlerbehebung bestand darin, SetCurrentDirectory während der Anwendungsinitialisierung auf einen gültigen Speicherort zu setzen, bevor eine Serialisierung stattgefunden hat.

    
dae721 17.07.2013 22:06
quelle