2013-01-02 29 views

回答

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

他们没有在任何接口中声明:这是一个超语言合同。 Serializable是一个标记接口,它通过Java序列化机制的契约来绑定实现它的类。最好的做法是声明一个private readResolve,这很明显,不可能有一个声明它的接口。

+0

由于期待你的答复。 'writeObject()/ readObject()'也被标记为'private',但是它们在'ObjectOutputStream/ObjectInputStream'处定义。 – GBX

1

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