【发布时间】:2016-06-23 20:04:06
【问题描述】:
如果我序列化一个Class对象(例如HashMap.class),然后在另一个JVM实例中反序列化它,结果证明反序列化的类与当前加载的类相同:
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();
}
}
在这种情况下,Java 如何能够反序列化对象以保留身份? Class 似乎没有实现 writeObject()/readObject()/readResolve()。
是否可以通过加载特定类/使用特定类加载器/使用特定 JVM 设置/在序列化期间执行某些操作来打破这种行为?是否存在加载的Class 与反序列化的不同的情况?换句话说,我可以依靠我的应用程序中的这种行为来序列化和反序列化Class 对象吗?
【问题讨论】:
-
恕我直言:反序列化的类对象应该与相同类型的“标准”类对象无法区分。见docs.oracle.com/javase/7/docs/api/…
标签: java serialization classloader