重学Java-序列化

1,148 阅读2分钟

什么是序列化与反序列化

序列化是将对象转换为可传输格式的过程。是一种数据的持久化手段,与只相反的称为反序列化。

Java中的序列化与反序列化

相关的类

  • java.io.Serializable
  • java.io.Externalizable

Serializable

类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义

Externalizable

Externalizable继承了Serializable, 该接口中定义了两个抽象⽅法:writeExternal()readExternal()。 当使⽤Externalizable接口来进⾏序列化与反序列化的时候需要开发⼈员重写writeExternal()与readExternal()⽅法,如果没有重写,则所有字段将会被设置为默认值,实现Externalizable, 并实现writeExternal()readExternal()⽅法可以指定序列化哪些属性

serialVersionUID

虚拟机是否允许反序列化, 不仅取决于类路径和功能代码是否⼀致, ⼀个⾮常重要的⼀点是两个类的序列化 ID 是否⼀致, 即serialVersionUID要求⼀致,在进⾏反序列化时, JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进⾏⽐较, 如果相同就认为是⼀致的, 可以进⾏反序列化, 否则就会出现序列化版本不⼀致的异常, 即是InvalidCastException。这样做是为了保证安全, 因为⽂件存储中的内容可能被篡改。当实现java.io.Serializable接口的类没有显式地定义⼀个serialVersionUID变量时候, Java序列化机制会根据编译的Class⾃动⽣成⼀个serialVersionUID作序列化版本⽐较⽤, 这种情况下, 如果Class⽂件没有发⽣变化, 就算再编译多 次, serialVersionUID也不会变化的。但是, 如果发⽣了变化,那么这个⽂件对应的serialVersionUID也就会发⽣变化。