https://zhuanlan.zhihu.com/p/62190281
今天,来总结一下感觉被遗忘了很久的JavaSE基础中的序列化和反序列化的概念。
序列化:是把对象转换为字节序列,永久存到磁盘中。在网络中传输对象也要进行序列化。
反序列化:是从磁盘中读取字节序列将它们反序列化成对象读出来。

【序列化的使用】
ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
注:只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。
默认的序列化方式 。
【对象序列化步骤】
1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
2) 通过对象输出流的writeObject()方法写对象。
【对象反序列化的步骤】
1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
2) 通过对象输入流的readObject()方法读取对象。
【序列化版本号】
serialVersionUID: 字面意思上是序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量
那怎么来生成序列化版本号呢?
方式一:


方式二:

【序列化版本号的作用】
当实现了Serializable的类(没有定义序列化版本号)序列化成功后进行了修改,当对这个类的实例对象进行反序列化时就会报错,因为这个对象的序列化版本号在类修改之后和之前的对应不上了(安全机制)。
解决办法:
在定义这个类时就指定一个序列化版本号,这样编译器就不会自动为其设置版本号。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)