在序列化/反序列化过程中,我们可以定义readObjectNoData()/writeReplace()/readResolve()
来自定义默认的序列化/反序列化行为。
现在我的问题是声明在哪里?与readUnshared()/writeUnshared()
中声明/定义ObjectInputStream/ObjectOutputStream
类似。
答案 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)
序列化机制使用反射来调用这些字段。检测基于方法签名,没有这些接口。