Se serializzare un oggetto Class
(per esempio, HashMap.class
), e quindi deserializzare in un altro esempio di JVM, si scopre che la classe deserializzato è identico a quello attualmente caricato:In che modo Java può deserializzare oggetti Class conservando la propria identità sugli oggetti Class attualmente caricati?
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
final class DeserializationTest {
static String path = "/home/suseika/test.ser";
static Class<HashMap> cls = HashMap.class;
public static void main(String[] args) throws Exception {
if (args[0].equals("serialize")) {
serialize();
} else if (args[0].equals("deserialize")) {
final Object deserialized = deserialize();
// The important line, prints "true"
System.out.println(deserialized == cls);
}
}
static Object deserialize() throws Exception {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(path));
return in.readObject();
}
static void serialize() throws Exception {
FileOutputStream fileOut = new FileOutputStream(path);
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(cls);
out.close();
fileOut.close();
}
}
Come è Java in grado di deserializzare gli oggetti in questo caso in modo che l'identità sia preservata? Class
non sembra implementare writeObject()
/readObject()
/readResolve()
.
Questo comportamento può essere interrotto con il caricamento di una particolare classe/utilizzando un particolare programma di caricamento classi/utilizzando una particolare configurazione JVM/facendo qualcosa durante la serializzazione? Esistono casi in cui lo Class
caricato non corrisponde a quello deserializzato? In altre parole, posso fare affidamento su questo comportamento nella mia applicazione per serializzare e deserializzare gli oggetti Class
?
IMHO: un oggetto di classe deserializzato dovrebbe essere indistinguibile di un oggetto di classe "standard" dello stesso tipo. Vedi https://docs.oracle.com/javase/7/docs/api/serialized-form.html#java.lang.Class – Xvolks