2010-10-14 12 views
7

Ich habe das noch nicht versucht, aber es scheint riskant. Der Fall, an den ich denke, ist die Instrumentierung einfacher VO-Klassen mit JiBX. Diese VOs werden über AMF und möglicherweise andere Schemata serialisiert. Kann jemand meinen Verdacht bestätigen oder leugnen, dass hinterhältige Sachen wie die Verbesserung des Bytecodes im Allgemeinen etwas durcheinander bringen und Hintergrundinformationen liefern könnten? Ich interessiere mich auch für den speziellen Fall von JiBX.Ist es sicher, Bytecode-Erweiterungstechniken für Klassen zu verwenden, die serialisiert werden könnten, und warum?

Antwort

7

Hinter den Kulissen, Serialisierung verwendet Reflektion. Ihre Bytecode-Manipulation fügt vermutlich Felder hinzu. Wenn Sie diese Felder nicht als vorübergehend markieren, werden sie wie normale Felder serialisiert. So

, sofern Sie die gleiche Bytecode Manipulation auf beiden Seiten durchgeführt haben, werden Sie in Ordnung sein.

Wenn Sie nicht benötigen Sie die Serialisierung Dokumentation zu lesen, um zu verstehen, wie die Rückwärtskompatibilität Arbeit verfügt. Im Wesentlichen , ich denke Sie Felder senden, die vom Empfänger nicht zu erwarten ist, und Sie sind in Ordnung; und Sie können Felder auslassen, und sie erhalten ihre Standardwerte auf der Empfängerseite. Aber sollten Sie dies in der Spezifikation überprüfen!

Wenn Sie nur Methoden hinzufügen, haben sie keine Auswirkungen auf die Serialisierung, es sei denn, es handelt sich um Dinge wie readResolve() usw., die speziell vom Serialisierungsmechanismus verwendet werden.

+0

+1 für den Hinweis auf den KISS Ansatz nur auf beiden Seiten zu verbessern. Definitiv, was ich zuerst versuchen würde. –

2

Das Hinzufügen/Ändern/Entfernen von öffentlichen oder geschützten Feldern oder Methoden zu einer Klasse wirkt sich auf die Deserialisierung aus. Ebenso wie das Hinzufügen von Schnittstellen. Diese werden unter anderem dazu verwendet, eine serialVersionUID zu generieren, die als Teil des Serialisierungsprozesses in den Stream geschrieben wird. Wenn die Klasse serialVersionUID der Klasse während der Deserialisierung nicht mit der geladenen Klasse übereinstimmt, schlägt sie fehl.

Wenn Sie die serialVersionUID explizit in Ihrer Klassendefinition festlegen, können Sie dies erreichen. Sie können auch readObject und writeObject implementieren.

Im Extremfall können Sie Externalizable und haben die volle Kontrolle über alle Serialisierung des Objekts implementieren.

Absolutes Worst-Case-Szenario (obwohl in einigen Situationen unglaublich nützlich) ist, writeReplace für ein komplexes Objekt zu implementieren, um es mit einer Art einfacher Wertobjekt in Serialisierung auszutauschen. Bei der Deserialisierung kann das einfachere Wertobjekt readResolve implementieren, um das komplexe Objekt auf der anderen Seite entweder neu zu erstellen oder zu lokalisieren. Es ist selten, wenn Sie das herausholen müssen, aber es macht wahnsinnig Spaß, wenn Sie es tun.

+1

+1 für 'serialVersionUID'. Ich habe das vergessen. Wenn Sie keine angeben, wird sie zur Laufzeit berechnet, was sich möglicherweise auf die Fähigkeit zum Verschieben von Objekten auswirkt. – dty