Simple rules of serialization and deserialization in Java

关于Java序列化和反序列化的原理机制和几种常见的实现方式网络上已经很多了,比如这篇 Java序列化进阶:Java内置序列化的三种方式

本文注重归纳关于序列化&反序列化的几条规则,做个简单备忘参考。

  • 一个Java对象能被序列化==当前对象或者父类实现了Serializable or Externalizable接口;
  • 某个子类是可序列化的[实现了Serializable or Externalizable,其父类是不可序列化的,那么这个父类在定义的时候必须带上一个no-argu constructor[无参构造函数],否则在运行时,readObject()方法会抛出java.io.InvalidClassException;
  • 父类[不可序列化]的无参构造函数在子类对象进行反序列化的时候会被调用,然而子类对象本身的构造函数并不会被调用;
  • Transient和Static修饰的属性不会被序列化,但对于Static来说有一个特殊情况,如果再加上final修饰符那么这个属性就是可以序列化的,这个时候这个属性就变成了一个常量;
  • 如果一个可序列化对象的成员变量引用了不可序列化的对象,那么编译能通过,但是会抛出运行时异常。

参考文献

  1. http://www.xyzws.com/Javafaq/what-are-rules-of-serialization-in-java/208
  2. https://baijiahao.baidu.com/s?id=1568611161638053&wfr=spider&for=pc

Leave a Comment

电子邮件地址不会被公开。 必填项已用*标注