java里的序列化反序列化、HttpMessageConverter、Jackson、消息转化器、对象转化器...都是啥?
前段时间在学习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()方法)。
兄弟们可能又懵了,不要研究,我简单说就是Serializable、ObjectOutputStream、ObjectInputStream
这三是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的结果:
相关文章:

java里的序列化反序列化、HttpMessageConverter、Jackson、消息转化器、对象转化器...都是啥?
前段时间在学习SSM框架(spring boot、spring MVC、mybatis)后端项目的时候,发现他们的项目里:响应类Result类要实现Serializable接口、转化响应给前端的时间数据的格式要用到什么“消息转换器”MappingJackson2HttpMwssageConvert…...

GNU/Linux - memtool使用
在Yocto中为NXP的i.MX系列芯片构建Linux系统时,可以加入一些实用工具,比如直接操作内存的memtool。 这些工具在imx-test包中,比如imx-test_git.bb里。 比如在imx-image-core.bb中,IMAGE_INSTALL "imx-test" ࿰…...

Qt5.12.8源码交叉编译带openssl版本
一.背景 近期项目由于对接方的Qt版本是Qt5.12.8,后台服务是https的,之前用的Qt5.15.10要切换成Qt5.12.8,并且为了能支持https,必须要重新编译Qt。 二.环境 环境准备: Ubuntu版本 :18.04; openss…...

串行并行数据转换
前言 串行数据传输通常在数据传输距离较远时使用,而并行数据传输适用于短距离、高速数据交换。通过转换,可以根据实际需求选择合适的传输方式,以优化数据传输效率和速度。串行数据传输在长距离传输中可以减少信号的干扰和失真,因为…...

推荐一个优秀的 .NET MAUI 组件库
目录 前言 组件介绍 组件展示 布局 按钮 复选框 进度条 导航栏 组件地址 最后 前言 .NET MAUI 的发布,项目中可以使用这个新的跨平台 UI 框架来轻松搭建的移动和桌面应用。 为了帮助大家更快地构建美观且功能丰富的应用,本文将推荐一款优秀…...

用Manim创建条形图【BarChart】
BarChart是Manim库中用于创建条形图的函数。它允许用户通过一组值创建一个条形图,其参数可以调整条形的外观和布局。 BarChart(values, bar_namesNone, y_rangeNone, x_lengthNone, y_lengthNone, bar_colors[#003f5c, #58508d, #bc5090, #ff6361, #ffa600],bar_w…...

iMES工厂管家:强大的工厂管理系统
iMES工厂管家:强大的工厂管理系统 在现代工厂管理中,iMES工厂管家作为一款功能强大的MES系统,为用户提供了全面的管理解决方案。本文将介绍iMES工厂管家的基本信息、特点、以及如何快速部署和使用。 软件简介 iMES工厂管家是一款基于.NetCor…...

iOS ------ 事件响应链
响应者链 响应者链是由一系列链接在一起的响应者(UIResponser之类:UIApplication,UIViewController,UIView)注组成的。一般情况下,一条响应链开始于第一响应者,结束于application对象。如果一个…...

Go 语言 switch 语句的特点
在 Go 语言中,switch 语句设计得更加简洁和直观,因此不需要显式使用 break 语句来终止一个分支。这种设计决策源于 Go 语言的一些设计哲学和目标,主要包括: 自动终止: Go 语言的 switch 语句会在每个 case 执行完成后自…...

【递归】什么是递归-C语言为例
递归是指一个函数在其定义中直接或间接调用自身的编程技巧。在C语言中,递归常用于解决可以被分解为更小的子问题的问题。递归函数通常由两个主要部分组成: 基准情况:这是递归停止的条件,通常是最简单的情况。 递归情况࿱…...

vue针对低版本浏览器不兼容es6特性解决方案,
browser.min.js 解决ES6兼容IE browser.min.js,polyfill.min.js vue针对安卓低版本、ios9 不兼容 es6特性解决方案 解决IE9无法使用promise的js脚本,引入后,还需跟browser.js配合使用 Babel 默认只转换新的 JavaScript 句法,po…...

嵌入式内存管理高频面试题及参考答案(4万字长文)
目录 嵌入式系统中内存管理的重要性 嵌入式系统中的内存主要分为哪几类? 静态内存分配和动态内存分配的特点 内存对齐的概念及其作用 嵌入式系统中为什么需要关注内存碎片问题 内存分区的概念及其在嵌入式系统中的应用 内存映射文件的概念及其在嵌入式系统中的作用 虚…...

TinyWebserver的复现与改进(2):项目的整体框架
上文我们成功运行了代码,本文我们将对项目的整体流程作一下讲解 如果你之前没做过相关的内容,对服务器的⾼并发模型也⼀⽆所知,不建议继续做下去,需要的前置知识有: Linux的基本命令(⭐)多进程…...

R 语言学习教程,从入门到精通,R 字符串(10)
1、R 字符串 R 语言字符串可以使用一对单引号 ’ ’ 或一对双引号 " " 来表示。 单引号字符串中可以包含双引号。 单引号字符串中不可以包含单引号。 双引号字符串中可以包含单引号。 双引号字符串中不可以包含双引号。 以下示例演示来字符串的使用: a …...

QT 简易音乐播放器
目录 放置控件 获取mp3文件 播放音乐 准备工作 加载模块 加载头文件 new一个output对象,Mediaplayer对象 把outpout对象交给mediaplayer对象 给播放器设置音乐 播放 优化 上一曲下一曲功能 双击歌曲播放 获取音乐时长和音乐播放时间 让音乐进度条跟随音乐走 调…...

代码随想录八股训练营day32
代码随想录八股训练营day32 1、synchronized和lock的区别是什么 (1)synchronized和lock的区别是什么 synchronized和Lock都是Java中用于实现线程同步的手段,synchronized是Java的关键字,基于JVM的内置锁实现,可以用于…...

11.面试题——消息队列RabbitMQ
1.RabbitMQ是什么?特点是什么? RabbitMQ是一种开源的消息队列中间件,用于在应用程序之间进行可靠的消息传递。它实现了AMQP(Advanced Message Queuing Protocol)协议,提供了强大的消息处理能力。RabbitMQ的…...

MySQL运维-日志
错误日志 二进制日志 介绍 日志格式 日志查看 日志删除 查询日志 慢查询日志...

synchronized重量级锁的实现原理是怎样的
重量级锁(Heavyweight Locking)是 Java 中 synchronized 关键字的锁机制的一部分,用于在高竞争情况下确保线程的同步。重量级锁主要通过操作系统的线程同步机制实现,通常涉及阻塞线程、上下文切换等开销较大的操作。以下是重量级锁…...

探索 GLTF 的世界:3D 内容的未来
在 3D 内容创作领域,GLTF 正在掀起波澜,成为跨不同平台提供丰富互动体验的未来标准。GL 传输格式 (GLTF) 由 Khronos Group 开发,是一种用于在工具和服务之间传输 3D 模型和场景的开放标准。它设计紧凑、高效且易于集成…...

【深度学习】【语音】TTS, CM-TTS,TTS扩散模型,论文
CM-TTS: Enhancing Real Time Text-to-Speech Synthesis Efficiencythrough Weighted Samplers and Consistency Models CM-TTS: 提高实时文本到语音合成效率 通过加权采样器和一致性模型 Xiang Li 1, Fan Bu 1, Ambuj Mehrish 2, Yingting Li 1, Jiale Han 1, Bo Cheng 1, S…...

【网络协议】网络劫持 - ARP_DNS欺骗篇
前言 网络劫持是一种网络攻击技术,攻击者通过拦截、篡改或重定向数据流量,控制用户的网络通信路径,干扰正常的网络服务。其方式可能包括DNS劫持、ARP欺骗和HTTP劫持等。通过这些手段,攻击者可以窃取敏感信息如个人身份数据和财务信…...

Linux 系统框架分析(一)
一、linux内核结构框图 对内核结构框图有个总体的把握,有助于理解为什么驱动要这样写,为什么写的应用程序所用的C库接口能够产生这么多的事情。 框图可以看出来,linux系统,包括五个系统 一、Linux内核结构介绍 Linux 内核是操作…...

Leetcode 剑指 Offer II 090.打家劫舍 II
题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 一个专业的小偷,计划偷窃一个环形街道上沿街的房屋&a…...

上海冷链配送新篇章 华鼎冷链科技以卓越服务餐饮品牌
在快速发展的上海餐饮连锁行业中,冷链运输作为保障食品安全与品质的关键环节,正迎来前所未有的发展机遇与挑战。华鼎冷链科技作为该领域的佼佼者,正引领着上海乃至全国冷链运输行业的新风尚。 华鼎冷链科技的成功并非一蹴而就。首先ÿ…...

学习鸿蒙-应用市场申请签名
1.需要的文件概念 .cer / .p7b / .p12 / .csr HarmonyOS应用/服务通过数字证书(.cer文件)和Profile文件(.p7b文件)来保证应用/服务的完整性。在申请数字证书和Profile文件前,首先需要通过DevEco Studio来生成密钥&am…...

LayUi插件
文档:日期和时间组件文档 - Layui layDate安装 npm install layui-laydate...

使用tailwindcss轻松实现移动端rem适配
本示例节选自小卷全栈开发实战系列的《Vue3实战》。演示如何用tailwindcss所支持的rem体系轻松实现一个仿b站移动端头部导航栏rem适配。 友情声明 学习分享不易,如果小伙伴觉得有帮助,点赞支持下。满30赞,将随文附赠录屏讲解,感谢…...

2021-11-08 51单片机2位秒表启动清零
缘由c51单片机,程序,仿真图,求帮助-编程语言-CSDN问答 #include "REG52.h"sbit K1 P1^0; sbit K2 P1^1; sbit K3 P1^2; sbit K4 P1^3; sbit P1_0P2^0; sbit P1_1P2^1; sbit P1_2P2^2; sbit P1_3P2^3; sbit P1_4P2^4; sbit P1_…...

谈基于大语言模型的图数据库路径检索
随着微软已经开源了GraphRAG项目的代码,基于图数据库的RAG 热度迅速升温。关注基于大语言模型与图模型数据库相结合的技术的人多了起来。 本文提出了一种类似人工搜索的“顺藤摸瓜”方法,实现图数据库的智能搜索方法。 本地私有数据存储和查询 本地私有…...