什么是序列化与反序列化
序列化是将对象转换为可传输格式的过程。是一种数据的持久化手段,与只相反的称为反序列化。
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
也就会发⽣变化。
近期评论