我正在阅读有关Java序列化的一些材料,发现对于自定义类型,我们可以在类型中定义两个成员函数来更改默认的序列化行为:
private void readObject(java.io.ObjectInputStream in)
private void writeObject(java.io.ObjectOutputStream out)
我有两个问题:
1.这两个函数都使用private
关键字限定,在序列化过程中如何调用它们?
2.我们都知道Java Serializable
接口是一个空接口,那么序列化机制如何知道调用这两个函数来序列化和反序列化呢?
期待你的帮助!
成
答案 0 :(得分:3)
这两个函数都使用private关键字限定,在序列化过程中如何调用它们?
Java序列化基本上涉及JVM中的魔术。哎呀,它甚至可以涉及创建一个对象而不需要调用构造函数。
我们都知道Java Serializable Interface是一个空接口,那么序列化机制如何知道调用这两个函数来序列化和反序列化呢?
很容易告诉(来自适当可信的代码)一个类是否通过反射提供某些方法。序列化框架代码足以确定它以及调用方法。
在普通Java中,只是从另一个类检测和调用私有方法是可行的(同样,使用适当可靠的代码):
import java.lang.reflect.*;
class Other {
private static void privateMethod() {
System.out.println("You can't call me, can you?");
}
}
public class Test {
public static void main (String[] args) throws Exception {
Method method = Other.class.getDeclaredMethod("privateMethod");
method.setAccessible(true);
method.invoke(null);
}
}
答案 1 :(得分:1)
这两个问题的答案是这些东西在Java实现中是硬编码的,因此“正常”规则不适用(可能有点不一致)。