【问题标题】:How do writeObject and readObject work? [duplicate]writeObject 和 readObject 是如何工作的? [复制]
【发布时间】:2012-08-30 02:54:24
【问题描述】:

当我阅读JDK 6.0 的源代码时,我在ArrayList 中发现了这两个方法。你看他们都是私人的。但是经过搜索,我没有找到任何其他调用它们的方法。我也考虑了本地方法,但仍然找不到。这两个方法好像是处理IO的,但是从来没有被调用过。

所以,我的问题是,它们是如何工作的?有没有其他方法可以调用私有方法?

/**
 * Save the state of the <tt>ArrayList</tt> instance to a stream (that is, serialize it).
 */
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException;

/**
 * Reconstitute the <tt>ArrayList</tt> instance from a stream (that is, deserialize it).
 */
private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException;

【问题讨论】:

  • 您可以随时尝试编辑方法以引发异常,然后查看堆栈跟踪以了解它们是如何被调用的。
  • @MattBall 谢谢!顺便说一句,另一个问题。本机方法可以调用私有方法吗?

标签: java serialization java-custom-serialization


【解决方案1】:

这两个方法在可序列化类中用于自定义序列化(又名Customize the Default Protocol)

文章正文:

然而,有一个奇怪而巧妙的解决方案。通过使用内置 序列化机制的特点,开发者可以增强 通过在其类文件中提供两种方法来正常处理。 这些方法是:

  1. private void writeObject(ObjectOutputStream out) 抛出 IOException;
  2. private void readObject(ObjectInputStream in) 抛出 IOException, ClassNotFoundException;

请注意,这两种方法都(并且必须)声明为私有,证明 这两种方法都没有被继承、覆盖或重载。这 这里的技巧是虚拟机会自动检查以查看 如果在相应的方法调用期间声明了任一方法。这 虚拟机可以随时调用您的类的私有方法 想要,但没有其他对象可以。

【讨论】:

    猜你喜欢
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2011-08-20
    • 2019-01-29
    相关资源
    最近更新 更多