java类序列化和反序列化
参考:https://zhuanlan.zhihu.com/p/144535172?utm_id=0
https://blog.csdn.net/qq_42617455/article/details/109622390
1、问题解答
(1)序列化和反序列化都需要哪些操作
对象要实现java.io.Serializable接口
增加序列化 ID(private static final long serialVersionUID)
转化成便于传输的格式
(2)在项目开发中我们使用的是比较流行的前后端分离,我向前端传输数据的时候也没有进行这些操作啊?
下面就是要说的在进行项目开发过程中常用的序列化格式json字符串。看过javaSE源码的都知道字符串是已经实现了Serializable接口的,所以字符串这种数据类型很方便用于传输,因为序列化和反序列的那些操作jdk已经给咱们封装好了,不需要咱们在考虑只需要专注于业务就ok了。
(3)json
什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法。
(4)springboot的json序列化
- Springboot目前最火的框架,在进行对象传输的时候springboot是怎么处理的,springboot项目中使用@ResponseBody或者@RestController自动的将对象转化成json字符串传递给前端(原理是默认使用jackson包进行的处理)
我们的类并没有实现Serializable接口,实际上这是Spring框架帮我们做了一些事情,Spring并不是直接把User对象进行网络传输,而是先把User对象转换成json格式的字符串,然后再进行传输的,而String类实现了Serializable接口并且显示指定了serialVersionUID 。
版权声明:本文为CSDN博主「Mounsey」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42617455/article/details/109622390
前端向后端发送json字符串。前端向后端传递json时需要转化成json字符串,后端通过@RequestBody可以把这个json字符串映射成java对象或者hashMap
这些注解之所以可以进行Json与JavaBean之间的相互转换,就是因为HttpMessageConverter发挥着作用。
org.springframework.http.converter.HttpMessageConverter 是一个策略接口,是Http request请求和response响应的转换器,该接口只有五个方法,它的canRead()方法返回true,然后它的read()方法会从请求中读出请求参数,绑定到readString()方法的string变量中。
当SpringMVC执行readString方法后,由于返回值标识了@ResponseBody,SpringMVC将使用StringHttpMessageConverter的write()方法,将结果作为String值写入响应报文,当然,此时canWrite()方法返回true。
public interface HttpMessageConverter<T> {
//判断当前转换器是否可以解析前端传来的数据
boolean canRead(Class<?> clazz, MediaType mediaType);
//判断当前转换器是否可以将后端数据解析为前端需要的格式
boolean canWrite(Class<?> clazz, MediaType mediaType);
//获取当前转换器可以解析的数据类型
List<MediaType> getSupportedMediaTypes();
//读取前端传来的数据
T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException;
//将后台数据转换,返回给前端
void write(T t, MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException;
}
流程如下:

前端发来请求后,先调用HttpInputMessage从输入流中获取Json字符串,然后在HttpMessageConverter中把Json转换为接口需要的形参类型。在HttpMessageConverter内部流程图如下:

2、序列化和反序列化
(1)介绍
java序列化是指把java对象转换为字节序列化的过程,而反序列化是指把字节序列恢复为java对象的过程。
(2)实现
被序列化的对象需要实现java.io.Serializable接口,该接口只是一个标记接口,不用实现任何方法
JDK提供java对象的序列化方式实现对象序列化传输,主要通过输出流java.io.ObjectOutputStream和对象输入流java.io.ObjectInputStream实现
java.io.ObjectOutputStream:表示对象输出流 , 它的writeObject(Object obj)方法可以对参 数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream:表示对象输入流 ,它的readObject()方法源输入流中读取字节序 列,再把它们反序列化成为一个对象,并将其返回。
serialVersionUID作用:虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化id是否一致。注意:序列化类新增属性时,不要修改serialVersionUID,避免反序列化失败,如果完全不兼容升级,避免发序列化混乱,那么请修改serialVersionUID值。
例如:开始的uid是1,后改成2则会报错
package com.redis.demo.dto;
import com.redis.demo.aop.Dict;
import lombok.Data;
import java.io.Serializable;
/**
* @Description :
* @Date : 2023/5/5
* @Author :
*/
@Data
public class TestDto implements Serializable {
private String a;
private String name;
private static final long serialVersionUID =1L;
}
序列化
public static void main(String[] args) throws Exception {
/**
* 将序列化保存到object.out文件
*/
FileOutputStream fos = new FileOutputStream("object.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
TestDto testDto = new TestDto();
testDto.setA("a");
testDto.setName("name");
oos.writeObject(testDto);
System.out.println(oos);
oos.flush();
oos.close();
}
反序列化,如果将TestDto的uid改成其他,则反序列化会报错
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("object.out");
ObjectInputStream ois = new ObjectInputStream(fis);
Object o = ois.readObject();
TestDto t = (TestDto) o;
System.out.println(t);
}

java类序列化和反序列化的更多相关文章
- java 对象序列化与反序列化
Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为 ...
- java之序列化与反序列化
1.这里主要是介绍Protobuf提供的序列化与反序列化的高效性.相对于传统的java提供的序列化来说,Protobuf的效率提高了很多倍.但是也有不足的地方,就是proto在对象序列化的时候抛弃了很 ...
- Java基础—序列化与反序列化(转载)
转载自: Java序列化与反序列化 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化 ...
- Java 中序列化与反序列化
一. 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.将程序中的对象,放入文 ...
- Java对象序列化与反序列化一 JSON
Java对象序列化与反序列化一 JSON 1. 依赖库 jackson-all-1.6.1.jar 2. 代码 public class Student { private String nam ...
- Java对象序列化和反序列化的工具方法
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- Java之序列化和反序列化
序列化的对象: package test_demo.SerializableOper; import java.io.Serializable; /* * 序列化对象需要实现序列号接口 * */ pu ...
- C# 实体类序列化与反序列化一 (XmlSerializer)
/// <summary> /// 实体类序列化的反序列化的类 /// </summary> /// <typeparam name="T">& ...
- JAVA的序列化与反序列化
一.为什么要进行序列化 再介绍之前,我们有必要先了解下对象的生命周期,我们知道Java对象的生命周期,也即Java中的远程方法调用RMI也会被用到,在网络中要传输对象的话,则必须要对对象进行序列化,关 ...
- 深入分析Java的序列化与反序列化
序列化是一种对象持久化的手段.普遍应用在网络传输.RMI等场景中.本文通过分析ArrayList的序列化来介绍Java序列化的相关内容.主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了 ...
随机推荐
- HA高可用集群部署
HA高可用集群部署 高可用 ZooKeeper 集群部署 zookeeper安装部署 注意:需要安装jdk,但jdk已经在第4章装过,这里直接装zookeeper #解压并安装zookeeper [r ...
- 如何通过CAD图中的坐标来确定是哪个坐标系
国内常见的坐标系 坐标系分为以下两种: 地理坐标系(Geographic Coordinate System, GCS) 投影坐标系(Projected Coordinate System, PCS) ...
- Vue3基本功能实现
vue3 介绍 # Vue3的变化 # 1.性能的提升 打包大小减少41% 初次渲染快55%, 更新渲染快133% 内存减少54% # 2.源码的升级 使用Proxy代替defineProperty实 ...
- A First course in FEM —— matlab代码实现求解传热问题(稳态)
这篇文章会将FEM全流程走一遍,包括网格.矩阵组装.求解.后处理.内容是大三时的大作业,今天拿出来回顾下. 1. 问题简介 涡轮机叶片需要冷却以提高涡轮的性能和涡轮叶片的寿命.我们现在考虑一个如上图所 ...
- 3. @RequestMapping注解
1. @RequestMapping 注解的功能 @RequestMapping 注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系. SpringMVC 接收到指定的请求 , ...
- 常见的Web安全攻击类型及其应对方法
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 6. 结论与展望 7. 附录:常见问题与解答 常见的Web安全攻击类型及其应对方法 随着网 ...
- 如何从AWS中学习如何使用AmazonSimpleStorageService(S3)进行数据存储
目录 文章标题:32. <如何从 AWS 中学习如何使用 Amazon Simple Storage Service (S3) 进行数据存储> 背景介绍: 随着数据量的不断增加,数据存储的 ...
- BLOB-CLOB 处理成String (*)
实体类中的写法: --实体类对应的类型为byte[] (clob为char[]). /* byte[] blob = commonService.getPersonImage(bean.getIdCa ...
- 使用libswresample库实现音频重采样
一.初始化音频重采样器 在音频重采样时,用到的核心结构是SwrContext,我们可以通过swr_alloc()获取swr_ctx实例,然后通过av_opt_set_int()函数和av_opt_se ...
- 利用Redis实现向量相似度搜索:解决文本、图像和音频之间的相似度匹配问题
在自然语言处理领域,有一个常见且重要的任务就是文本相似度搜索.文本相似度搜索是指根据用户输入的一段文本,从数据库中找出与之最相似或最相关的一段或多段文本.它可以应用在很多场景中,例如问答系统.推荐系统 ...