1

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

现在我的问题是声明在哪里?像readUnshared()/writeUnshared()ObjectInputStream/ObjectOutputStream.

4

3 回答 3

2

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;

于 2013-01-03T05:16:43.173 回答
2

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

于 2013-01-02T12:05:22.783 回答
1

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

于 2013-01-02T12:08:52.507 回答