在Java中序列化自定义类型

时间:2012-06-25 06:04:43

标签: java serialization

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

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

我有两个问题:
1.这两个函数都使用private关键字限定,在序列化过程中如何调用它们?
2.我们都知道Java Serializable接口是一个空接口,那么序列化机制如何知道调用这两个函数来序列化和反序列化呢?

期待你的帮助!

2 个答案:

答案 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实现中是硬编码的,因此“正常”规则不适用(可能有点不一致)。