Finale transiente Felder und Serialisierung
Ist es möglich, @ zu habfinal transient
-Felder, die nach der Serialisierung in Java auf einen anderen als den Standardwert gesetzt werden? Mein Usecase ist eine Cache-Variable - deshalb ist estransient
. Ich habe auch die Angewohnheit, @ zu machMap
Felder, die nicht geändert werden (d. h. der Inhalt der Karte wird geändert, das Objekt selbst bleibt jedoch gleich)final
. Diese Attribute scheinen jedoch widersprüchlich zu sein - während der Compiler eine solche Kombination zulässt, kann ich das Feld nur auf @ setzenull
Nach der Unserialisierung.
Ich habe Folgendes ohne Erfolg versucht:
Einfache Feldinitialisierung (im Beispiel gezeigt): Dies ist, was ich normalerweise mache, aber die Initialisierung scheint nicht nach der Unserialisierung zu erfolgen;initialization in constructor (ich glaube, das ist semantisch das gleiche wie oben);zuweisung des feldes inreadObject()
- kann nicht gemacht werden, da das Feld @ ifinal
.Im Beispielcache
istpublic
nur zum Testen.
import java.io.*;
import java.util.*;
public class test
{
public static void main (String[] args) throws Exception
{
X x = new X ();
System.out.println (x + " " + x.cache);
ByteArrayOutputStream buffer = new ByteArrayOutputStream ();
new ObjectOutputStream (buffer).writeObject (x);
x = (X) new ObjectInputStream (new ByteArrayInputStream (buffer.toByteArray ())).readObject ();
System.out.println (x + " " + x.cache);
}
public static class X implements Serializable
{
public final transient Map <Object, Object> cache = new HashMap <Object, Object> ();
}
}
Ausgabe
test$X@1a46e30 {}
test$X@190d11 null