2

我正在阅读一些关于Java序列化的资料,发现对于自定义类型,我们可以在类型中定义两个成员函数来改变默认的序列化行为:

private void readObject(java.io.ObjectInputStream in)
private void writeObject(java.io.ObjectOutputStream out)

对此我有两个疑问:
1. 这两个函数都是用private关键字限定的,在序列化过程中它们是如何调用的?
2、我们都知道JavaSerializable接口是一个空接口,那么序列化机制是怎么知道调用这两个函数进行序列化和反序列化的呢?

期待您的帮助!

4

2 回答 2

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);
    }
}
于 2012-06-25T06:07:33.563 回答
1

这两个问题的答案是这些东西在 Java 实现中是硬编码的,因此“正常”规则不适用(这可能有点不一致)。

于 2012-06-25T06:07:55.243 回答