`
kyleliu
  • 浏览: 27547 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Serializable 使用心得

阅读更多

1. writeObject和readObject必须是private的, 否则不会被调用.

2. Object的field的读写顺序, 遵循先进先出的原则.

3. 从ObjectInputStream中读Object的原理是: 先从流中读出每个元素的类型, 例如是数组, String还是Object等, 如果是Object, 就继续从流中读取这个类的描述信息, load这个类, 然后取这个类的第一个非Serializable的父类的public无参数构造函数, 通过构造函数创建实例, 最后调用readObject或defaultReadObject为这个实例赋值.

4. 从3可以看出, 在从ObjectInputStream中读出的Object时,和写进去的不是同一个Object。

5. 不用怀疑, JVM有办法调用你的类的private方法和父类的default构造函数.

6. 序列化写一个类的object, 序列化读的程序的classpath中也要有这个类, 否则读时跑出ClassNotFound.

7. 序列化的这个类的第一个非Serializable的父类, 必须有一个public的, 无参数的构造函数.

8. 具体细节可以参考JDK源码中的java.io.ObjectInputStream和java.io.ObjectStreamClass.

9. 总之, 序列化读就是创建一个空Obejct, 然后通过readObject赋值的过程.

10. 默认的序列化,会同时序列化static的field,就如同普通的field一样。

11. 序列化写时,同一个对象,2次写入,不论是直接写入,还是做为其他object的一个成员变量被连带写入的,实际上只是写了一次,另一次只是在stream做了一个标记。序列化读时,读2次,返回的实际上也是一个对象。

12. 将2个互相引用的对象序列化,根据上面的一个对象只会被序列化一次的原则,因此实际上这2个对象也只是分别被写入一次。

13. 向ObjectOutputStream中写一个Object,却从ObjectInputStream中连续读两次,第二次出EOFException.

14. 只有写时用了writeInt等方法,读时才能用readInt,否则出EOFException。

15. Externalizable与Serializable不同,其反序列化时,会通过这个类的默认构造函数来构造实例,随后再调用readExternal,因此如果这个类没有默认构造函数,或默认构造函数不是public的,那么,就会出异常。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics