《阿里巴巴Java开发手册》中有以下规定:
java.io.Serializable是标记接口(里面是空的),未实现此接口的类将无法进行序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。
transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致,这个所谓的序列化ID,就是我们在代码中定义的serialVersionUID。
场景1:A类有serialVersionUID,序列化之后,改动serialVersionUID,反序列化出错。
场景2:A类有serialVersionUID,序列化之后,增加或改动字段,反序列化成功。
场景3:A类无serialVersionUID,序列化之后,增加或改动字段,反序列化失败。
场景4:A类无serialVersionUID,序列化之后,反序列化成功。
网友评论