Java 中序列化和反序列化

news2025/4/17 21:38:45

Java 中的序列化(Serialization)和反序列化(Deserialization)是将对象和二进制数据(或其他格式)之间转换的过程,常见于对象传输、缓存、持久化等场景。

下面是 Java 中常见的几种 序列化/反序列化方式 👇:

🔹 1. Java 自带的序列化(JDK 默认)

✅ 特点:

  • 使用 ObjectOutputStream / ObjectInputStream
  • 类必须实现 Serializable 接口
  • 输出是二进制格式

💡 示例:

// 序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.ser"));
oos.writeObject(myObject);
oos.close();

// 反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.ser"));
MyClass obj = (MyClass) ois.readObject();
ois.close();

⚠️ 缺点:

  • 不跨语言
  • 可读性差(是二进制)
  • 修改类结构后容易出错(除非加 serialVersionUID

🔹 2. JSON 序列化(如 Jackson、Gson、Fastjson)

✅ 特点:

  • 可读性强(文本格式)
  • 跨语言、轻量
  • 易调试、常用于 Web 接口通信

💡 Jackson 示例:

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(myObject); // 序列化
MyClass obj = mapper.readValue(json, MyClass.class); // 反序列化

🔹 3. XML 序列化(如 JAXB)

✅ 特点:

  • 结构清晰
  • 可跨平台、跨语言
  • 常用于老系统或配置文件

💡 JAXB 示例:

// 序列化
JAXBContext context = JAXBContext.newInstance(MyClass.class);
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(myObject, new File("data.xml"));

// 反序列化
Unmarshaller unmarshaller = context.createUnmarshaller();
MyClass obj = (MyClass) unmarshaller.unmarshal(new File("data.xml"));

🔹 4. Hessian / Kryo / Protobuf / Avro 等高性能方案

🏎️ Kryo

  • 高性能二进制序列化库
  • 比 Java 默认序列化快得多
  • 适用于游戏、缓存、RPC 等场景
Kryo kryo = new Kryo();
Output output = new Output(new FileOutputStream("file.bin"));
kryo.writeObject(output, myObject);
output.close();

🧠 Protobuf(Google Protocol Buffers)

  • 跨语言、高压缩比、高性能
  • 常用于 RPC 框架(gRPC 等)

🔹 5. 自定义序列化

实现 Externalizable 接口,自定义 read/write 逻辑。

public class MyClass implements Externalizable {
    private String name;
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(name);
    }
    public void readExternal(ObjectInput in) throws IOException {
        name = in.readUTF();
    }
}

🧾 总结对比表:

方式格式跨语言性能是否可读
JDK 原生二进制一般
JSON (Jackson)文本中等
XML (JAXB)文本较慢
Kryo二进制
Protobuf二进制非常快
Externalizable自定义视实现而定取决于你

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2331168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sql-labs靶场 less-2

文章目录 sqli-labs靶场less 2 联合注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”&#xf…

git clone(复制)下载

1、复制 下载地址 2、打开网页,点击 克隆/下载按扭 3、按提示复制命令行到终端 4、VS里打开终端,并粘贴以下命令 5、 下载完毕 6、复制文件夹到你选定的位置 7、用VSCODE打开文件夹,开始你接下来的工作

Android设置adjustResize时无法生效 解决办法

删除Activity类下执行全屏的一行参数。 将图中这段Activity类中执行命令给删除就解决了。 注意关闭后状态栏和导航栏的透明度就无法自动处理了&#xff0c;需要到values和values-night下的themes.xml手动设置状态栏背景颜色。 <item name"android:statusBarColor"…

按键长按代码

这些代码都存放在定时器中断中。中断为100ms中断一次。 数据判断&#xff0c;看的懂就看吧

优选算法第八讲:链表

优选算法第八讲&#xff1a;链表 1.链表常用操作和技巧总结2.两数相加3.两两交换链表中的节点4.重排链表5.合并k个升序链表6.k个一组翻转链表 1.链表常用操作和技巧总结 2.两数相加 3.两两交换链表中的节点 4.重排链表 5.合并k个升序链表 6.k个一组翻转链表

4S店汽车维修保养管理系统 (源码+lw+部署文档+讲解),源码可白嫖!

摘要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式已经与当今4S店汽车维修保养管理系统的业务需求不相适应,也与4S店汽车维修保养管理系统化建设的发展趋势不相适应。本文针对这一需求设计并实现了…

【NLP 面经 8】

目录 一、文本生成任务 模型架构方面 训练数据方面 生成策略方面 二、命名实体识别任务NER 模型架构方面 特征工程方面 训练优化方面 三、情感分析任务 模型架构方面 训练数据方面 超参数调整方面 四、计算余弦相似度并添加符合条件结果 提示&#xff1a; 思路与算法 任由深渊的…

UE5学习笔记 FPS游戏制作43 UI材质

文章目录 实现目标制作UI材质使用UI材质 实现目标 把图片变为灰色 制作UI材质 右键新建一个材质 左侧细节栏&#xff0c;材质域改为用户界面&#xff0c;混合模式改为半透明 此时输出节点应该有两个属性 在内容浏览器里找到要用的图片&#xff0c;然后向上拖动到材质标题…

12、主频和时钟配置实验

一、I.MX6U 时钟系统详解 1、系统时钟来源 开发板的系统时钟来源于两部分: 32.768KHz 和24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源, 24MHz 晶振是 I.MX6U 内核和其它外设的时钟源。 2、7路PLL时钟源 I.MX6U 的外设有很多,不同的外设时钟源不同, NXP 将…

2025 年河北交安安全员考试:巧用行业报告丰富知识储备​

河北交通行业发展迅速&#xff0c;各类行业报告蕴含大量有价值信息。考生可从河北省交通运输行业发展报告、安全专项检查报告等资料入手。在行业发展报告中&#xff0c;了解本省交通建设规模、重点项目规划等内容&#xff0c;这些信息与交安安全员工作紧密相关。比如&#xff0…

​2025快递业绿色包装创新发展论坛(上海)将于9月3日举办

​2025快递业绿色包装创新发展论坛&#xff08;上海&#xff09;将于9月3日举办 为进一步推进快递包装标准化、循环化、减量化、无害化转型&#xff0c;促进邮政快递业绿色低碳发展&#xff0c;在“2025 快递物流新质生产力发展论坛暨 2025 长三角国际快递物流供应链与智能装备…

stm32+esp8266+机智云手机app

现在很多大学嵌入式毕设都要求云端控制&#xff0c;本文章就教一下大家如何使用esp8266去连接机智云的app去进行显示stm32的外设传感器数据啊&#xff0c;控制一些外设啊等。 因为本文章主要教大家如何移植机智云的代码到自己的工程&#xff0c;所以前面的一些准备工作&#x…

【android bluetooth 框架分析 01】【关键线程 1】【关键线程介绍】

1. 为什么学习蓝牙协议栈之前&#xff0c;必须先梳理清楚这几大线程&#xff1f; 为什么 学习协议栈之前 最好是要先梳理清楚 关键线程 bt_stack_manager_threadbt_jni_threadbt_main_threadbt_a2dp_sink_worker_thread 1.1 蓝牙协议栈是典型的“多线程异步系统” 蓝牙协议…

CAS与sychronized优化

文章目录 CAS优化sychronized优化 CAS优化 CAS 优化过程: CAS是一种乐观锁机制&#xff0c;它通过比较内存中的值与预期值是否一致来决定是否更新。如果一致&#xff0c;则更新&#xff1b;如果不一致&#xff0c;则说明有其他线程修改了该值&#xff0c;CAS操作失败&#xff…

软考中级-软件设计师 2023年上半年下午题真题解析:通关秘籍+避坑指南

&#x1f4da; 目录&#xff08;快速跳转&#xff09; 大题&#xff08;下午题&#xff09;&#xff08;每题15分&#xff0c;共75分&#xff09;一、数据流图/数据库设计 &#x1f4be;&#x1f33e; 试题一&#xff1a;农事管理服务平台数据流分析问题1&#xff1a;实体识别问…

数据结构|排序算法(二)插入排序 希尔排序 冒泡排序

一、插入排序 1.算法思想 插入排序&#xff08;Insertion Sort&#xff09;是一种简单的排序算法&#xff0c;其基本思想是&#xff1a;将待排序的元素插入到已经有序的序列中&#xff0c;从而逐步构建有序序列。 具体过程如下&#xff1a; 把待排序的数组分为已排序和未排…

案例-流量统计

1.建一个data目录&#xff0c;在data下建log.txt文件 输入手机号码 上行流量 下行流量 2.在com.example.flow下建四个Java类3.flowBean flowMapper flowReducer flowDriver

Codeforces Round 1011 (Div. 2)

Dashboard - Codeforces Round 1011 (Div. 2) - Codeforces Problem - B - Codeforces 题目大意&#xff1a; 给你一个数组&#xff0c;你可以用一段子序列中没有出现的最小非负整数,替换数组中的组序列&#xff0c;经过若干操作&#xff0c;让数组变为长度为1&#xff0c;值…

时序数据异常检测-综述

更新中 异常检测基本概念 广义的Out-of-Distribution(广义的OOD)来描述异常检测的相关问题。OOD包括五个相关的子领域,分别为Anomaly Detection(AD)、Novelty Detection(ND)、Open Set Recogntion(OSR)、Out-of-Distribution(OOD)和Outlier Detection(OD)。这5个…

多类型医疗自助终端智能化升级路径(代码版.下)

医疗人机交互层技术实施方案 一、多模态交互体系 1. 医疗语音识别引擎 # 基于Wav2Vec2的医疗ASR系统 from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC import torchaudioclass MedicalASR:def __init__(self):self.processor = Wav2Vec2Processor.from_pretrai…