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的,那么,就会出异常。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值