Gdybym serializować Class
obiekt (na przykład HashMap.class
), a następnie deserializować go w innej instancji JVM, okazuje się, że innej niż serializowana klasa jest identyczny z aktualnie załadowanego:W jaki sposób Java może deserializować obiekty klasy, zachowując ich tożsamość do aktualnie załadowanych obiektów klasy?
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();
}
}
Jak jest Java móc deserializować obiekty w tym przypadku, aby zachować tożsamość? Class
nie wydaje się implementować writeObject()
/readObject()
/readResolve()
.
Czy to zachowanie można zepsuć, ładując daną klasę/używając określonego programu ładującego klasy/używając określonej konfiguracji maszyny JVM/wykonując coś podczas serializacji? Czy są przypadki, w których załadowany Class
nie byłby taki sam jak deserialized jeden? Innymi słowy, czy mogę polegać na tym zachowaniu w mojej aplikacji, aby przekształcić do postaci szeregowej i deserializować obiekty o numerach Class
?
IMHO: a klasa postaci innej niż serializowana obiekt powinien być nie do odróżnienia "standardowego" obiektu klasy tego samego typu. Zobacz https://docs.oracle.com/javase/7/docs/api/serialized-form.html#java.lang.Class – Xvolks