与java中的序列化相关的方法声明

时间:2015-10-22 04:50:06

标签: java serialization deserialization

我正在阅读序列化的java文档,发现如果我们需要显式实现序列化和反序列化,我们需要实现以下方法:

private void writeObject(java.io.ObjectOutputStream out)
 throws IOException

private void readObject(java.io.ObjectInputStream in)
 throws IOException, ClassNotFoundException;

private void readObjectNoData()
 throws ObjectStreamException;

有人可以告诉我谁调用这些方法,因为这些方法不在Object类和Serializable接口中(因为它是一个标记接口)。

1 个答案:

答案 0 :(得分:3)

  

有人可以告诉我谁调用这些方法,因为这些方法不在Object类和Serializable接口中

即使他们会在那里,他们也不会以“正常”方式从外部调用,因为他们是private(最后,他们甚至无法继承)。

正如@Andreas(不是我:))在评论中说,运行时库通过reflection调用它们。您可以在jdk/src/java.base/share/classes/java/io/ObjectStreamClass.java(链接可能随时间变化)源文件的Java运行时库中找到相关代码:

...
private Method writeObjectMethod;
private Method readObjectMethod;
private Method readObjectNoDataMethod;

...

writeObjectMethod = getPrivateMethod(cl, "writeObject",
                            new Class<?>[] { ObjectOutputStream.class },
                            Void.TYPE);
readObjectMethod = getPrivateMethod(cl, "readObject",
                            new Class<?>[] { ObjectInputStream.class },
                            Void.TYPE);
readObjectNoDataMethod = getPrivateMethod(
                            cl, "readObjectNoData", null, Void.TYPE);
...

getPrivateMethod()是一种实用工具方法,它通过反射API查找Class的给定方法。

如果其中一个Method引用不为null,则表示相应的类包含该方法,并且可以像

一样调用它
...
writeObjectMethod.invoke(obj, new Object[]{ out });
...

稍后。