细节一:
如果说 一个类实现了 Serializable 接口,表示这个类的对象是可被序列化的,Java 底层会根据这个类里面所有的内容进行计算,计算出一个 long 类型的序列号(或版本号)。假设计算出来的版本号是 1,当我创建了一个这个类的对象的时候,在对象里面就包含了 版本号 1,用序列化流写到本地文件中的时候,也会把版本号写到文件中,但如果修改了 Javabean 里面的代码,Java 底层会重新计算出一个版本号,假设为 2,这时 用反序列化流把对象读取到内存中之后,会发现两个版本号不一样,代码直接报错。
因此,报错的原因在于,文件中的版本号 跟 Javabean 的版本号不匹配
处理方案:修改 Javabean 的时候,固定版本号,不让版本号发生变化。定义 Javabean 的时候,先手动把版本号定义出来,一旦自己定义了,Java 底层就不会重新再计算了。
定义版本号(序列号)的两种办法:
方式1. private static final long serialVersionUID = 1L ;
方式2. 对 idea 进行一个设置
总结:如果想把一个 Javabean 对象序列化到本地文件中,Javabean 类要实现 Serializable 接口,还要加上 serialVersionUID 版本号(虽然版本号不加也没事,但最好加上)
细节二:
有一些成员变量的值,我不想序列化到本地文件,比如 address,我要把家庭住址保密,就需要给这个成员变量加 transient 关键字修饰
比如:private transient String address ;
transient :瞬态关键字,作用是 不会把当前属性 序列化到本地文件中(该关键字标记的成员变量不参与序列化过程)。在反序列化读取的时候,这个被修饰的变量是默认初始化值
细节三:
序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了
标签:文件,流和反,Java,版本号,细节,序列化,Javabean From: https://www.cnblogs.com/gagaya2/p/17787677.html