writeObject和readObject如何工作?

时间:2012-08-30 02:54:25

标签: java serialization java-custom-serialization

当我阅读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;

1 个答案:

答案 0 :(得分:3)

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

文章中的文字:

  然而,有一个奇怪但狡猾的解决方案。通过使用内置   序列化机制的特点,开发人员可以增强   通过在其类文件中提供两个方法来实现正常过程。   那些方法是:

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

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