Warum ist diese Klasse nicht serialisierbar?
-
20-09-2019 - |
Frage
Ich habe die Implementierung von Mersenne-Twister bei verwendet http://www.math.sci.hiroshima-u.ac.jp/~m-mat/mt/versions/java/mtrandom.java Als Drop-In-Ersatz für den Standardwert java.util.Random
Klasse. Es sind jedoch vier Felder (ein int, ein Boolescher und zwei Byte []) als markiert als transient
. Dies bedeutet, dass ich ein Objekt dieser Klasse nicht serialisieren kann, ohne benutzerdefinierte Funktionen zu implementieren.
Die Frage ist, dass es einen Grund dafür gibt, dass diese Felder als transient gekennzeichnet sind? Gibt es einen Code, in dem Informationen enthält, die keinen Sinn ergeben, wenn das Objekt aus einer Datei eingelesen wird? Ich habe das entfernt transient
Modifikator von den Feldern und es scheint einwandfrei zu funktionieren, aber ich habe es nicht intensiv getestet und könnte es Fälle geben, in denen es bricht?
Persönlich kann ich nicht sehen, warum, da alles, was in der Klasse getan wird, arithmetisch ist.
Lösung
Höchstwahrscheinlich die Gründe für das Making alle der nicht statischen Felder der Klasse transient
war so, dass die MTRandom
Klasse bleibt binär kompatibel mit java.util.Random
, von denen es erweitert wird.
Also theoretisch könnten Sie eine serialisieren MTRandom
Instanz und deserialisieren es als Random
Instanz und alles würde funktionieren.
Wenn diese Felder nicht sind transient
, Dann würden sie serialisiert und unvereinbar werden.
Soweit ich das beurteilen kann, sollte das Entfernen der Transienten für Sie jedoch kein Problem verursachen.
Andere Tipps
Aus dem Kommentar zu serialVersionUID
, Es sieht so aus, als ob der Autor keine Serialisierung in Betracht ziehen wollte. Hinzufügen transient
Kann einige Compiler/Ide -Warnungen unterdrückt haben.