什么是序列化

序列化是把java对象的状态(也就是实例变量,不是方法—)以二进制形式保存到内存、文件或者进行网络传输, 并可以通过反序列化恢复对象状态.

什么情况下需要序列化

  1. 需要将内存中的对象保存到一个文件或者数据库中的时候
  2. 用套接字在网络上传送对象
  3. 通过RMI传输对象

    怎么序列化

    Java 类只需要实现 java.io.Serializable接口, JVM 就会把 Object 对象按默认格式序列化.

    什么是 serialVersionUID ?如果你不定义这个, 会发生什么?

    serialVersionUID 是一个 private static final long 型 ID,SerialVerionUID 用于对象的版本控制。 也可以在类文件中指定 serialVersionUID。不指定 serialVersionUID的后果是,当你添加或修改类中的任何字段时, 则已序列化类将无法恢复, 因为为新类和旧序列化对象生成的 serialVersionUID 将有所不同。

    怎么控制某些类成员不被序列化

  4. 使用transient关键字修饰的成员变量不会被序列化,如HashMap中的modCount就是用transient修饰的,modCount主要用于判断HashMap是否被修改,没有必要被序列化。

  5. 静态变量不会被序列化。很好理解,静态变量是属于类的,而不是某个对象的状态。我们序列化面向的是对象,是想要将对象的状态保存下来,所以静态变量不会被序列化。反序列化得到的对象中的静态变量的值是当前jvm中静态变量的值。静态变量对于同一个jvm中同一个类加载器加载的类来说,是一样的。对于同一个静态变量,不会存在同一个类的不同实例拥有不同的值。