Nếu tôi serialize một đối tượng Class
(ví dụ, HashMap.class
), và sau đó deserialize nó trong một thể hiện của JVM, nó quay ra rằng lớp deserialized là giống hệt với một hiện nạp:Làm thế nào để Java có thể deserialize các đối tượng Class trong khi vẫn giữ bản sắc của chúng cho các đối tượng Class đang được nạp?
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();
}
}
thế nào là Java có thể deserialize các đối tượng trong trường hợp này để danh tính được bảo tồn? Class
dường như không thực hiện writeObject()
/readObject()
/readResolve()
.
Hành vi này có thể bị hỏng khi tải một lớp cụ thể/sử dụng trình nạp lớp cụ thể/sử dụng thiết lập JVM cụ thể/thực hiện điều gì đó trong quá trình tuần tự hóa không? Có trường hợp nào được tải Class
sẽ không giống với trường hợp được deserialized không? Nói cách khác, tôi có thể dựa vào hành vi này trong ứng dụng của tôi để tuần tự hóa và deserialize Class
đối tượng?
IMHO: một đối tượng lớp deserialized nên không thể phân biệt của đối tượng lớp "chuẩn" cùng loại. Xem https://docs.oracle.com/javase/7/docs/api/serialized-form.html#java.lang.Class – Xvolks