在哪个类/接口readObjectNoData(),writeReplace(),readResolve()声明?

时间:2013-01-02 12:02:11

标签: java java-io

在序列化/反序列化过程中,我们可以定义readObjectNoData()/writeReplace()/readResolve()来自定义默认的序列化/反序列化行为。

现在我的问题是声明在哪里?与readUnshared()/writeUnshared()中声明/定义ObjectInputStream/ObjectOutputStream类似。

3 个答案:

答案 0 :(得分:2)

它们未在任何界面中声明:这是一种语言外合同。 Serializable是一个标记接口,它通过Java Serialization机制的契约绑定实现它的类。最好的做法是声明一个private readResolve,这很明显,不可能有一个声明它的接口。

答案 1 :(得分:2)

ObjectStreamClass hasReadObjectNoDataMethod()/hasReadResolveMethod()/hasWriteReplaceMethod()方法中定义哪个用于标识目标类是否定义readObjectNoData()/writeReplace()/readResolve()方法,如果是,则在ObjectInputStream/ObjectOutputStream.

中调用这些方法

ObjectInputStream.readSerialData(.... if (obj != null && slotDesc.hasReadObjectNoDataMethod() && handles.lookupException(passHandle) == null) { slotDesc.invokeReadObjectNoData(obj); }

ObjectStreamClass还声明以下字段private Method readObjectNoDataMethod;private Method writeReplaceMethod;private Method readResolveMethod;

答案 2 :(得分:1)

序列化机制使用反射来调用这些字段。检测基于方法签名,没有这些接口。