Java基础 序列化流和反序列化流的 三个使用细节

细节一:

如果说 一个类实现了 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 :瞬态关键字,作用是 不会把当前属性 序列化到本地文件中(该关键字标记的成员变量不参与序列化过程)。在反序列化读取的时候,这个被修饰的变量是默认初始化值

 

细节三:

序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了

 

posted @   1stzz1  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示