第四步,通过自定义 Converter 进行序列化和反序列化

发布时间:2026/7/23 15:50:41

第四步,通过自定义 Converter 进行序列化和反序列化
第四步通过自定义 Converter 进行序列化和反序列化在软件开发中序列化和反序列化是数据交换的核心环节。无论是将对象存储到文件、通过网络传输还是与数据库交互我们都需要一种机制来将内存中的对象转换为字节流序列化以及将字节流还原为对象反序列化。虽然许多框架如 Jackson、Gson提供了默认的序列化方式但在实际项目中我们常常需要自定义 Converter 来满足特定需求比如处理复杂的日期格式、加密字段、或兼容遗留系统的数据格式。本文将带你深入理解自定义 Converter 的原理并通过两个实战示例手把手教你如何实现灵活的序列化和反序列化。## 什么是自定义 Converter简单来说Converter 是一个转换器它定义了如何将一种类型的数据转换为另一种类型。在序列化上下文中它通常用于-序列化时将 Java/Python 对象转换为 JSON/XML/字节流。-反序列化时将 JSON/XML/字节流还原为对象。默认的序列化工具如 Python 的json模块只能处理基本类型字符串、数字、列表、字典。当遇到自定义对象如datetime、Decimal时就会报错。自定义 Converter 就是为了解决这类问题而生的。## 为什么需要自定义 Converter假设你有一个订单系统其中包含一个created_at字段类型为datetime。默认的 JSON 序列化器无法直接处理datetime对象。你可能会想到将datetime转换为字符串但这样一来反序列化时又需要手动解析字符串。自定义 Converter 可以自动完成这个双向转换。此外自定义 Converter 还可以-加密敏感字段序列化时自动加密反序列化时自动解密。-兼容旧系统将新系统的数据格式转换为旧系统能识别的格式。-优化性能通过自定义转换减少不必要的内存开销。## 示例一使用 Python 自定义 datetime 转换器在 Python 中json模块默认不支持datetime对象。我们可以通过继承json.JSONEncoder和json.JSONDecoder来实现自定义 Converter。pythonimport jsonfrom datetime import datetime, date# 自定义序列化器Encoderclass DateTimeEncoder(json.JSONEncoder): def default(self, obj): # 如果是 datetime 或 date 对象则转换为 ISO 格式字符串 if isinstance(obj, (datetime, date)): return obj.isoformat() # 其他类型交给默认处理器或抛出异常 return super().default(obj)# 自定义反序列化器Decoderclass DateTimeDecoder(json.JSONDecoder): def __init__(self, *args, **kwargs): # 设置自定义的 object_hook在反序列化时自动处理字典 super().__init__(object_hookself.object_hook, *args, **kwargs) def object_hook(self, dct): # 遍历字典的键值对 for key, value in dct.items(): # 尝试将 ISO 格式字符串解析为 datetime 对象 if isinstance(value, str): try: # 先尝试解析为 datetime包含时间部分 dct[key] datetime.fromisoformat(value) except (ValueError, TypeError): # 如果失败则保持原样 pass return dct# 测试代码if __name__ __main__: # 创建一个包含 datetime 的字典 data { name: Alice, created_at: datetime.now(), updated_at: date.today() } # 序列化使用自定义 Encoder json_str json.dumps(data, clsDateTimeEncoder, ensure_asciiFalse) print(序列化结果:, json_str) # 反序列化使用自定义 Decoder restored_data json.loads(json_str, clsDateTimeDecoder) print(反序列化后:, restored_data) print(类型验证:, type(restored_data[created_at])) # 应该是 datetime代码解析-DateTimeEncoder重写了default方法当遇到datetime或date对象时返回 ISO 格式字符串。-DateTimeDecoder通过object_hook钩子在解析每个字典时尝试将字符串转换为datetime对象。- 这种设计保证了序列化和反序列化的对称性日期对象 - 字符串 - 日期对象。## 示例二Java 中使用 Jackson 自定义 Converter在 Java 生态中Jackson 是最流行的 JSON 处理库。很多时候我们需要处理自定义类型比如将LocalDateTime转换为时间戳或者对字符串进行加密。下面是一个使用 Jackson 自定义序列化器和反序列化器的完整示例。javaimport com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.core.JsonParser;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.*;import com.fasterxml.jackson.databind.module.SimpleModule;import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;import java.io.IOException;import java.time.LocalDateTime;import java.time.format.DateTimeFormatter;// 自定义序列化器将 LocalDateTime 转换为自定义格式字符串class LocalDateTimeSerializer extends JsonSerializerLocalDateTime { private static final DateTimeFormatter formatter DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss); Override public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 将 LocalDateTime 格式化为 2023-10-01 12:30:00 gen.writeString(value.format(formatter)); }}// 自定义反序列化器将自定义格式字符串解析为 LocalDateTimeclass LocalDateTimeDeserializer extends JsonDeserializerLocalDateTime { private static final DateTimeFormatter formatter DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss); Override public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String dateStr p.getText(); // 解析字符串为 LocalDateTime return LocalDateTime.parse(dateStr, formatter); }}// 包含 LocalDateTime 字段的 POJO 类class Order { private String orderId; private LocalDateTime createTime; // getter 和 setter 省略实际开发中请使用 Lombok 或手动生成 public String getOrderId() { return orderId; } public void setOrderId(String orderId) { this.orderId orderId; } public LocalDateTime getCreateTime() { return createTime; } public void setCreateTime(LocalDateTime createTime) { this.createTime createTime; }}public class CustomConverterDemo { public static void main(String[] args) throws JsonProcessingException { // 创建一个 ObjectMapper 实例 ObjectMapper mapper new ObjectMapper(); // 创建自定义模块并注册序列化器和反序列化器 SimpleModule module new SimpleModule(); module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer()); module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer()); // 注册模块到 ObjectMapper mapper.registerModule(module); // 可选注册 JavaTimeModule 以支持其他日期类型 mapper.registerModule(new JavaTimeModule()); // 创建测试对象 Order order new Order(); order.setOrderId(ORD001); order.setCreateTime(LocalDateTime.now()); // 序列化 String json mapper.writeValueAsString(order); System.out.println(序列化结果: json); // 输出类似{orderId:ORD001,createTime:2023-10-01 12:30:00} // 反序列化 Order restoredOrder mapper.readValue(json, Order.class); System.out.println(反序列化后: restoredOrder.getCreateTime()); // 输出2023-10-01T12:30:00但实际显示取决于 toString 方法 }}代码解析-LocalDateTimeSerializer继承JsonSerializer在serialize方法中定义如何将LocalDateTime转换为字符串。-LocalDateTimeDeserializer继承JsonDeserializer在deserialize方法中定义如何从字符串还原LocalDateTime。- 通过SimpleModule将自定义转换器注册到ObjectMapper这样在序列化/反序列化时就会自动调用这些转换器。## 总结自定义 Converter 是处理序列化和反序列化时的一把利器。它让我们能够1.处理非标准类型如日期、时间、货币、自定义对象等。2.实现业务逻辑在转换过程中加密、解密、格式化或校验数据。3.保持代码整洁将转换逻辑集中在一个地方避免在业务代码中到处手动转换。在实际项目中建议遵循“单一职责原则”为每种特殊类型创建独立的 Converter并通过模块化注册的方式集成到主序列化引擎中。这样既能提高代码的可维护性又能灵活应对未来可能出现的新的数据类型需求。记住自定义 Converter 的核心思想是对称性序列化和反序列化的逻辑应该互为逆操作这样才能保证数据在转换过程中不丢失信息。掌握了这个原则你就能轻松驾驭任何复杂的序列化场景。

相关新闻

GLM-5.1开源大模型:长程任务处理与自主Agent架构解析

GLM-5.1开源大模型:长程任务处理与自主Agent架构解析

2026/7/23 15:40:40

1. 项目背景与核心价值 蓝耘元生代云MaaS平台最新上线的GLM-5.1模型,标志着开源大模型在长程任务处理能力上的重大突破。这个8小时自主Agent架构的发布,本质上解决了传统开源模型在复杂任务链式调用中的三大痛点:任务记忆碎片化、多步骤逻辑断…

动画MV制作全流程解析:从视觉风格到IP运营策略

动画MV制作全流程解析:从视觉风格到IP运营策略

2026/7/23 15:40:40

1. 先搞清楚这个项目到底解决什么实际问题 看到“【时光代理人】全新单曲「A Web of Lies」原版MV公开”这个标题,很多人第一反应可能是“哦,就是个新歌MV发布”。但如果你真的做过内容创作、视频制作或IP运营,就会知道这类项目背后要解决的核…

大模型学习指南:从真实需求出发,一步步掌握核心技能(收藏版)

大模型学习指南:从真实需求出发,一步步掌握核心技能(收藏版)

2026/7/23 15:40:40

本文作者从实际工作需求出发,介绍了如何通过解决具体问题逐步学习大模型技术。从知识库项目需求出发,逐步深入文本嵌入、向量检索、接口设计等关键技术,并分享了在项目实践中如何根据需求调整技术方案。文章强调,学习大模型不必遵…

信创迁移不是简单替换:一文看懂VMware替代中的架构演进、双栈一致与大规模落地路径

信创迁移不是简单替换:一文看懂VMware替代中的架构演进、双栈一致与大规模落地路径

2026/7/23 16:30:49

在VMware替代逐渐从“可选项”变成“必须项”的背景下,越来越多企业开始把目光转向信创平台。对架构师背景的IT决策人来说,真正需要解决的并不是“能不能替”,而是“怎么替才稳、怎么替才不影响业务、怎么替才能兼顾现有架构和后续演进”。因…

计算机Django毕设实战-基于 Django 的社区宠物寄养服务预约管理平台 智能化宠物寄养服务匹配系统设计【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机Django毕设实战-基于 Django 的社区宠物寄养服务预约管理平台 智能化宠物寄养服务匹配系统设计【完整源码+LW+部署说明+演示视频,全bao一条龙等】

2026/7/23 16:30:49

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

“天眼评分4.0”正式上线:外汇经纪商评价体系再升级

“天眼评分4.0”正式上线:外汇经纪商评价体系再升级

2026/7/23 16:30:49

为了帮助全球投资者更加全面、客观、及时地了解交易商的综合实力和实时变化情况,“天眼评分”体系已完成全面升级,“天眼评分4.0”正式上线 —— 通过优化评价模型、丰富评价维度,并加强风险信息的时效性,为用户提供更科学、更透明…

济宁实体店老手掏心窝子:雷达真系列公司福利表出手,线上邮寄怕被调包?这套避坑指南比金子还贵

济宁实体店老手掏心窝子:雷达真系列公司福利表出手,线上邮寄怕被调包?这套避坑指南比金子还贵

2026/7/23 16:30:48

济宁实体店老手掏心窝子:雷达真系列公司福利表出手,线上邮寄怕被调包?这套避坑指南比金子还贵

切问学术Agent:面向学术研究的智能辅助工具与高效科研解决方案

切问学术Agent:面向学术研究的智能辅助工具与高效科研解决方案

2026/7/23 16:30:45

很多时候,你和同门在效率与视野上的差距,并非源于智力或努力,而在于信息获取与处理的“工具差”。当别人还在用传统方式大海捞针时,有人已经用新工具建好了知识雷达。尤其在查找和消化国外文献这个核心环节,工具带来的…

[具身智能-626]:边缘计算中的图像传感器原始数据到YUV,在到RGB输入的神经网络,中间经过几次插值转换(包括硬件电路实现)?

[具身智能-626]:边缘计算中的图像传感器原始数据到YUV,在到RGB输入的神经网络,中间经过几次插值转换(包括硬件电路实现)?

2026/7/23 16:20:44

前置关键定义(统一口径,避免工程讨论歧义) 插值 上采样重建:根据已有像素估算缺失像素(Demosaic、色度上采样属于插值) 单纯抽取像素的「色度下采样(YUV444→420)」≠ 插值&…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/23 3:40:08

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/23 4:40:05

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/23 1:54:13

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

2026/7/23 0:09:56

更多请点击: https://kaifayun.com 第一章:企业级AI搜索落地选型实战手册(含LLMRAGHybrid架构对比矩阵与ROI测算模板) 企业级AI搜索系统落地成败,核心在于技术选型与业务价值的精准对齐。盲目堆砌大模型能力或过度依赖…

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

2026/7/23 0:09:56

1. 项目概述与核心价值在嵌入式系统开发,尤其是基于ARM Cortex-M内核的微控制器项目中,深入理解并熟练配置芯片的片上外设,是从“点亮LED”迈向“实现复杂系统功能”的关键一步。Tiva™ TM4C129LNCZAD作为TI公司Cortex-M4F家族中的高性能成员…

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

2026/7/23 0:09:56

一、快速声明与争议背景本文是对 AtomCode 终端 spinner 时长显示 fmt_dur 相关说法的事实性核验。2026 年 7 月 CSDN 上出现两篇互相矛盾的博文,近期又有 AI 在对话中输出格式描述 XhYm / YmZs / Zs。本文基于 AtomCode 仓库 main4677ddfa 及全分支 Git 历史给出可…