java里的序列化反序列化、HttpMessageConverter、Jackson、消息转化器、对象转化器...都是啥?

news2024/9/24 6:24:00

        前段时间在学习SSM框架(spring boot、spring MVC、mybatis)后端项目的时候,发现他们的项目里:响应类Result类要实现Serializable接口、转化响应给前端的时间数据的格式要用到什么“消息转换器”MappingJackson2HttpMwssageConverter、还有什么setObjectMapper、redis里也要设置什么序列化器......这些到底是个什么玩意?

        虽然这些东西不怎么重要,一些教程视频里也会说不用研究,但是要是不会的话这样学下去还是很难受,完全不知道为啥就照着写这些代码浑身刺挠,于是我就把这些了解个大概,然后用简短的话解释一下大概(本人也没有认真去研究,就搞了个一知半解,反正知道是怎么回事就行了)

1、序列化(Serialization)、反序列化(Deserialization)是咩野?

我们知道在浏览器检查请求、响应报文时,我们传递的都是什么数据?是JSON字符串。

那么要深究其底层原理的话,这些字符串其实都是一些二进制字符流,这些字节流记录着都是数据,浏览器的内置api能把字节字符流数据变成JSON字符串。

可是我们java里的数据都是啥?是对象。

那对象怎么进行解析成二进制字节流然后变成字符串啊?这就需要序列化,否则就是解析成一些看不懂的乱码。

那么以我结合多篇文章以及视频,加上鄙人粗浅的见解,简单来说就两句话:

—— Java序列化就是指把【Java对象】转换为【字节序列】的一个过程

—— Java反序列化就是指把【字节序列】恢复为【Java对象】的一个过程

有啥好处?

1、网络传输:可以将对象数据变成字节流通过网络发送。

2、 持久化:不序列化的话,对象数据是存在内存的;序列化之后可以将对象数据写入磁盘或数据库,并在需要时重新加载。

3、 分布式系统:在分布式系统中,对象的序列化状态可以被用来在不同的节点之间传递对象。

2、Serializable是啥?

其他博主的文章:Serializable是什么?(超详细讲解)-CSDN博客

简单说:就是来着java.io库的一个原生Api接口,是Java提供的一种原生的序列化机制

当一个类希望被用于“Java对象的持久化”、“网络传输”或“分布式系统”中的对象传递,就得实现继承这个接口。

比如我们的Result类,这个要高频、反复在接口间进行网络响应、传递的对象信息,那就得继承实现Serializable接口,就具备了序列化反序列化的能力,数据也能解析得让人看得懂。

注意这里并不是说他就已经可以被序列化了,而是它具有“可以被序列化”的“资格”,就比如参加一个就把卡颜局,他成年了、长得够帅够高,ok那就获得进去的资格,那并不代表他一定能得吃了,还得看他人品、情商....等等。

 那么注意了!!!既然它是java内部原生的接口,依赖于Java类的定义,那么他序列化后的数据是特定于Java平台的二进制格式,这意味着它们通常只能在Java应用程序中被反序列化。而且对类的更改敏感,如果序列化的对象类在反序列化时发生不兼容的更改,可能会导致序列化版本冲突。

最后一点,它是通过使用 【ObjectOutputStream 和 【ObjectInputStream 来实现,这两玩意又是java.io包的两个用于对象序列化和反序列化的两个类,【ObjectOutputStream 用于将Java对象转换成字节序列(用ObjectOutputStream 的writeObject()方法),【ObjectInputStream 用于从字节序列中恢复Java对象(ObjectInputStream 的readObject()方法)。

兄弟们可能又懵了,不要研究,我简单说就是SerializableObjectOutputStreamObjectInputStream 这三是java I/O库的类和接口,都来自java.io这个包,我把这三比作你能进入一家酒吧卡颜局的必备条件,【序列化】就是“在酒吧卡颜局好好玩的开心”的事件。

1、首先你得先有【Serializable】外貌、年龄这些硬性条件,才有资格进去。

2、然后你得通过【ObjectOutputStream】这个“局头”(或者理解为你的朋友),通过“writeObject()” 跟保安打招呼或亲自接待...等等,才能把你引进酒吧吧。

3、最后你得通过【ObjectInputStream】这个你的好兄弟\好闺蜜或者你自己,通过“readObject()” 兄弟闺蜜的花言巧语、或喝酒助攻、或你自己的无敌钞能力,才能把酒吧妹妹\哥哥把到手,欢心带回家。

3、Jackson库,以及Jackson里的ObjectMapper

其他博主对Jackson的文章:Java Jackson库使用教程_jackson maven-CSDN博客

其他博主对Jackson的ObjectMapper文章:Jackson -- ObjectMapper_jackson objectmapper-CSDN博客

Jackson中ObjectMapper_jacksonobjectmapper-CSDN博客

简单来说:Jackson就是一个独立的库,用于处理JSON数据的序列化和反序列化。而ObjectMapper是Jackson提供的一个核心类,又叫“对象转换器”,用于专门用来将Java对象转换为JSON格式的字符串,以及将JSON字符串转换回Java对象的。也可以理解为对java对象进行json序列化,和将json数据反序列化为java对象

为什么有了Serialiazable,还要有Jackson的ObjectMapper?

Serialiazable是受限于Java平台的对象信息的序列化;

Jackson的ObjectMapper是对任意平台的JSON序列化,而JSON序列化是平台无关的,因为它遵循标准的JSON格式规范,就不受限于Java平台

这种JSON序列化也更适用于需要与其他语言或平台进行数据交换的场景,例如Web服务的请求和响应。

不依赖于类定义,因此对类的更改更加灵活

例子:spring项目里JacksonObjectMapper配置对java对象里的时间格式的序列化

JSON序列化通过使用Jackson的 ObjectMapper 类的 writeValue 方法来实现

(是有一点像....但是血缘不一样奥)

4、HttpMessageConverter是啥

其他博主对HttpMessageConverter的文章:HttpMessageConverter-CSDN博客

简单来说:又叫“消息转换器”,是Spring MVC中的一个接口,用于将HTTP请求和响应消息转换为Java对象,或者将Java对象转换为HTTP消息(注意,不单单是简单的java对象的序列化,他可以进行多种格式的数据间相互转换!!专门服务于HTTP协议报文的)

主要功能:

1.请求消息的转换:将HTTP请求体转换为Java对象,通常用于处理请求数据;

2.响应消息的转换:将Java对象转换为HTTP响应体,通常用于返回响应数据;

例子:在spring项目里因为返回响应的create_time、update_time格式不对,没有进行Http信息数据格式转换,导致接口返回信息格式不对,就要用【HttpMessageConverter】的【MappingJackson2HttpMessageConverter】来把java对象转换成Http协议需要的数据格式

Spring MVC提供了多个 HttpMessageConverter 的【实现类】来处理不同类型的数据格式,例如 JSON、XML、字符串等。常见的实现包括:(区别于单纯的序列化、反序列化)

1、MappingJackson2HttpMessageConverter:用于将JSON数据与Java对象相互转换,依赖于Jackson库;

2、MappingJackson2XmlHttpMessageConverter:用于将XML数据与Java对象相互转换,依赖于Jackson的XML扩展;

3、StringHttpMessageConverter:用于将字符串与Java字符串对象相互转换;

/

4、ByteArrayHttpMessageConverter:用于将字节数组与Java字节数组对象相互转换;

5、FormHttpMessageConverter:用于将表单数据与多部分表单数据与Java对象相互转换; 

然后注意,看上面例子图片里会发现,MappingJackson2HttpMessageConverter还需要【Jackson里的ObjectMapper】这个对象转换器

因为【MappingJackson2HttpMessageConverter】是【HttpMessageConverter】的一个实现类,它使用【Jackson的ObjectMapper】来处理JSON格式的数据。这意味着,当你配置Spring MVC来使用【MappingJackson2HttpMessageConverter】时,它实际上是在利用【Jackson的ObjectMapper】来进行JSON的序列化和反序列化。

最后,我问AI的结果:

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

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

相关文章

Vue:Vue3-TypeScript-Pinia-Vite-pnpm / 基础项目 / 20240807

一、项目技术栈 / 依赖 序号技术栈版本解释1node20.14.02vue 3.4.31 3vite 5.3.4 4TypeScript 5.2.2 5 types/node 22.0.2 解决TypeScript项目中缺少对应模块的类型定义文件的问题6 element-plus 2.7.8 ui组建7 types/js-cookie js-cookie 3.0.6 3.0.5 8 sass 1.77.8 9 hu…

zdppy+vue3+onlyoffice开发文档系统实战20240807上课笔记 解决了最近文档页面几个遗留的文档

小技巧 vite配置 open: true 可以自动打开浏览器。 目前 遗留任务 1、在名称前面,渲染这个文档的图标 2、大小的基本的单位是kb,超过1024kb则换成mb,主要是这两个单位 3、数据按照最近访问时间倒序 4、给文件名价格链接,实现和…

C语言深度剖析(部分)--剩下随缘更新

C语言深度剖析 关键字auto-最宽容大度的关键字 变量的分类 代码块:用{ }括起来的区域 局部变量:包含在代码块中的变量,局部变量具有临时性,进入代码块,自动形成局部变量,退出代码块自动释放。 全局变量…

鸿蒙AI功能开发【hiai引擎框架-人脸比对】 基础视觉服务

hiai引擎框架-人脸比对 介绍 本示例展示了使用hiai引擎框架提供的人脸比对能力。 本示例模拟了在应用里,选择两张图片,计算两个图中最大人脸的相似度 需要使用hiai引擎框架人脸比对接口hms.ai.face.faceComparator。 效果预览 使用说明:…

C++ STL专题 list的底层实现

目录 1.模拟实现list 2.节点模板讲解 3.迭代器模板讲解 3.1为什么template 有三个类型参数 (1).class T (2).class ref (3).class ptr 3.2 *重载 3.3 ->重载 3.4 前置和后置的重载 3.5 前置--和--后置的重载 3.6 和!的重载 4. list模板讲解 4.1 begin()函数 …

[译] How things get done on the Go Team

6天前,掌舵Go语言团队12年Rsc在golang-dev/群组发文宣布,将在9月1号后辞去当前职位,转去做 Gaby 和 Oscar. 这对于Go语言发展无疑是里程碑式的事件。 本篇内容是根据6月份他和另外两位同事参与Go Time音频录制内容的整理与翻译,英…

代码随想录算法训练营Day22 | Leetcode 77 组合 Leetcode 216 组合总和Ⅲ Leetcode17 电话号码的字母组合

前言 回溯算法中递归的逻辑不重要,只要掌握回溯的模板以及将问题转化为树形图,整个问题就很好解决了,比二叉树简单。 Leetcode 77 组合 题目链接:77. 组合 - 力扣(LeetCode) 代码随想录题解:…

K-means聚类算法的应用以及实现

K-means 聚类算法属于无监督学习,它会将相似的对象归到同一个簇中,该算法原理简单,执行效率高,并且容易实现,是解决聚类问题的经典算法。 尽管如此,任何一款算法都不可能做到完美无瑕,K-measn 算…

计算机毕业设计选题推荐-房屋租赁系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【python】python心理健康医学数据分析与逻辑回归预测(源码+数据集+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

php 中 (0 == ‘abc‘) 为真

https://andi.cn/page/621653.html

第129天:内网安全-横向移动WmiSmbCrackMapExecProxyChainsImpacket

这里这个环境继续上一篇文章搭建的环境 案例一: 域横向移动-WMI-自带&命令&套件&插件 首先上线win2008 首先提权到system权限 wmic是windows自带的命令,可以通过135端口进行连接利用,只支持明文方式,优点是不用上传别…

解决IDEA中Maven项目依赖已存在但仍报找不到的错误

问题描述: 如图显示的是lombok存在 这里已经导入lombok依赖包 如图所示依赖包确实已经导入 解决方案: 点击后会重新启动项目,操作后我们重新配置一下maven 设置完后,点击重新引入就行

JAVA实战项目笔记02

一、新增员工 1.接口设计 2.设计数据库的employee表 3.设计DTO DTO:封装前端提交过来的数据 实体类如下:包含更多属性 public class Employee implements Serializable {private static final long serialVersionUID 1L;private Long id;private Str…

vivado OPT_SKIPPED

当跳过候选基元单元的逻辑优化时,OPT_skipped属性 更新单元格以反映跳过的优化。当跳过多个优化时 在同一单元格上,OPT_SKIPPED值包含跳过的优化列表。 架构支持 所有架构。 适用对象 OPT_SKIPPED属性放置在单元格上。 价值观 下表列出了各种OPT_design选…

使用ventoy制作U盘安装centos8

使用ventoy制作U盘安装centos8 参考:https://blog.51cto.com/u_14120/11118656 推荐这个https://www.zhihu.com/question/290783457/answer/3103388484 1、ventoy官网 https://www.ventoy.net/en/download.html 2、下载完成直接制作u盘启动盘 4、将下载iso镜像…

维特根斯坦:所谓天才,就是不放弃实践的勇气

天才并不比任何一个诚实的人有更多的光,但他有一个特殊的透镜,可以将光线聚焦至燃点。 我象一个骑在马上的拙劣骑手一样,骑在生活上。我之所以现在还未被抛下,仅仅归功于马的良好本性。 一个人懂得太多就会发现,要不…

大模型开源教程「动手学大模型应用开发」,从零基础到掌握大模型开发的关键技能!

LLM 正逐步成为信息世界的新革命力量,其通过强大的自然语言理解、自然语言生成能力,为开发者提供了新的、更强大的应用开发选择。随着国内外井喷式的 LLM API 服务开放,如何基于 LLM API 快速、便捷地开发具备更强能力、集成 LLM 的应用&…

营销材料翻译质量对销售渠道的影响

在当今的全球市场中,与不同受众进行有效沟通的能力对于企业的成功至关重要。营销材料的高质量翻译在通过销售渠道塑造客户旅程方面发挥着重要作用,影响着知名度、参与度、转化率和保留率。方法如下: 提高品牌知名度 在销售渠道的顶端&#x…

Android 14 Power键亮灭屏流程

Android14中Power键的事件分发和Android10的是不一样的,这里并没有经过interceptKeyBeforeDispatching方法,而是直接走到了interceptKeyBeforeQueueing方法 PhoneWindowManager中的堆栈如下 07-06 08:59:04.481 1844 1984 D WindowManager: intercep…