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 :瞬态关键字,作用是 不会把当前属性 序列化到本地文件中(该关键字标记的成员变量不参与序列化过程)。在反序列化读取的时候,这个被修饰的变量是默认初始化值
细节三:
序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~