在序列化/反序列化过程中,我们可以定义readObjectNoData()/writeReplace()/readResolve()
自定义默认序列化/反序列化行为。
现在我的问题是声明在哪里?像readUnshared()/writeUnshared()
在 ObjectInputStream/ObjectOutputStream
.
In ObjectStreamClass hasReadObjectNoDataMethod()/hasReadResolveMethod()/hasWriteReplaceMethod()
method is define 用于标识目标类是否定义了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;
它们没有在任何接口中声明:这是一个语言外契约。Serializable
是一个标记接口,它绑定一个通过 Java 序列化机制的协定实现它的类。最佳实践是声明 a private readResolve
,这很明显不可能有一个接口来声明它。
序列化机制使用反射来调用这些字段。检测基于方法签名,这些没有接口。