在序列化/反序列化过程中,我们可以定义readObjectNoData()/writeReplace()/readResolve()
来定制默认的序列化/反序列化行为。在哪个类/接口中声明readObjectNoData(),writeReplace(),readResolve()?
现在我的问题是,声明在哪里?像readUnshared()/writeUnshared()
在ObjectInputStream/ObjectOutputStream
中被声明/定义。
在序列化/反序列化过程中,我们可以定义readObjectNoData()/writeReplace()/readResolve()
来定制默认的序列化/反序列化行为。在哪个类/接口中声明readObjectNoData(),writeReplace(),readResolve()?
现在我的问题是,声明在哪里?像readUnshared()/writeUnshared()
在ObjectInputStream/ObjectOutputStream
中被声明/定义。
在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;
他们没有在任何接口中声明:这是一个超语言合同。 Serializable
是一个标记接口,它通过Java序列化机制的契约来绑定实现它的类。最好的做法是声明一个private readResolve
,这很明显,不可能有一个声明它的接口。
序列化机制使用反射来调用这些字段。检测是基于方法签名的,没有这些接口。
由于期待你的答复。 'writeObject()/ readObject()'也被标记为'private',但是它们在'ObjectOutputStream/ObjectInputStream'处定义。 – GBX