当前位置: 首页 > news >正文

序列化与反序列化的原理及实践

一、什么是序列化?

序列化是将对象的状态信息转换为可以存储或传输的形式的过程。如果一个对象可以被序列化,那么就可以将其状态保存到磁盘上,或者通过网络传输。在 Java 中,序列化主要由 java.io.ObjectOutputStreamjava.io.ObjectInputStream 类来实现。

二、序列化的原理

当一个对象被序列化时,它会被转换成字节流。这个过程包括对象的类信息、对象的数据成员等。序列化通常用于以下场景:

  • 保存对象的状态到文件中以便以后使用(持久化)。
  • 在网络上传输对象。
  • 将对象存储在字节数组中以备后续处理或使用。
三、实现序列化的基本步骤

要使一个类的对象可以被序列化,这个类必须实现 Serializable 接口。这是一个标记接口,表示实现了它的对象可以被序列化。

示例代码:
import java.io.Serializable;public class User implements Serializable {private static final long serialVersionUID = 1L;private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}// getters and setters
}

序列化可以通过 ObjectOutputStream 实现:

import java.io.*;public class SerializeDemo {public static void main(String[] args) {User user = new User("Alice", 30);try (FileOutputStream fos = new FileOutputStream("user.ser");ObjectOutputStream oos = new ObjectOutputStream(fos)) {oos.writeObject(user);System.out.println("User object has been serialized to user.ser");} catch (IOException e) {e.printStackTrace();}}
}
四、反序列化

反序列化是序列化的逆过程,即将字节流转换回对象。这通常用于恢复从文件或网络读取的对象实例。

示例代码:
import java.io.*;public class DeserializeDemo {public static void main(String[] args) {User user = null;try (FileInputStream fis = new FileInputStream("user.ser");ObjectInputStream ois = new ObjectInputStream(fis)) {user = (User) ois.readObject();System.out.println("Deserialized User...");System.out.println("Name: " + user.getName());System.out.println("Age: " + user.getAge());} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
五、注意事项
  • 版本兼容性:序列化时会检查 serialVersionUID,如果类进行了修改,需要确保 serialVersionUID 的一致性,否则可能会导致 InvalidClassException
  • 敏感数据保护:对于敏感信息如密码等,不应进行序列化。
  • 定制序列化:可以重写 writeObject()readObject() 方法来控制序列化和反序列化的细节。

相关文章:

  • js逆向——webpack扣取代码
  • 第J2周:ResNet50V2算法实战与解析
  • 微服务的优点及在云原生时代的合理落地方式
  • 设计模式之门面(Facade)模式
  • 【Java异常】(简简单单拿捏)
  • 剑指 offer 刷题集
  • java 生成.h文件,java调用c语言dll动态链接库流程
  • uni-app App版本更新
  • C语言习题~day33
  • react通过下拉框选择多个,并展示在下方的方式
  • 【工具分享】Darkside勒索病毒解密工具
  • 每天五分钟深度学习框架pytorch:激活函数在神经网络中的应用
  • 数据结构—(java)反射,枚举,lambda表达式
  • 开发受用户喜欢有声听书APP:快速满足用户需求的秘诀
  • [PICO VR眼镜]眼动追踪串流Unity开发与使用方法,眼动追踪打包报错问题解决(Eye Tracking/手势跟踪)
  • [数据结构]链表的实现在PHP中
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【知识碎片】第三方登录弹窗效果
  • js算法-归并排序(merge_sort)
  • maven工程打包jar以及java jar命令的classpath使用
  • Python连接Oracle
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • SQL 难点解决:记录的引用
  • 订阅Forge Viewer所有的事件
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 模型微调
  • 推荐一个React的管理后台框架
  • 再谈express与koa的对比
  • 中文输入法与React文本输入框的问题与解决方案
  • ​如何使用QGIS制作三维建筑
  • #每天一道面试题# 什么是MySQL的回表查询
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (39)STM32——FLASH闪存
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (原创)可支持最大高度的NestedScrollView
  • (转)详解PHP处理密码的几种方式
  • . NET自动找可写目录
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .Net中间语言BeforeFieldInit
  • .pop ----remove 删除
  • 。Net下Windows服务程序开发疑惑
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @RequestMapping用法详解
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)
  • [Angular 基础] - 表单:响应式表单
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [CQOI 2010]扑克牌
  • [CSS]一文掌握