我正在阅读序列化的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接口中(因为它是一个标记接口)。
答案 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 });
...
稍后。