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的序列化 为什么实现了 ...
随机推荐
- THM武器化
Weaponization thm:https://tryhackme.com/room/weaponization 武器化 了解和探索常见的红队武器化技术.您将学习使用业内常见的方法构建自定义有效载 ...
- 慢 SQL 优化之索引的作用是什么?
前言 本文针对 MySQL 数据库的 InnoDB 存储引擎,介绍其中索引的实现以及索引在慢 SQL 优化中的作用. 本文主要讨论不同场景下索引生效与失效的原因. 慢SQL与索引的关系 慢SQL优化原 ...
- P3498 [POI2010]KOR-Beads 题解
前言: 最近在做哈希的题,发现了这道好题,看题解里很多大佬的方法都很巧妙,自己就发一个较为朴素的方法吧. 题意: 题目传送门 给你一个序列,需要求出数 k,使划分的子串长度为 k 时,不同的子串数量最 ...
- 一个支持WinForms换肤的开源组件
推荐一个一键换肤的WinForms皮肤组件. 项目简介 这是一个支持自定义WinForms窗口.控件颜色.禁用状态.动画效果的皮肤组件. 支持的组件有:多选框.分割线.按钮.文本框.单选按钮.输入框. ...
- Cause: org.apache.ibatis.builder.BuilderException: Ambiguous collection type for property 'emps'. You must specify 'javaType' or 'resultMap'
错误原因 这个错误通常表示在解析 Mybatis 映射文件(Mapper XML)时出现了问题,可能的原因有两个: 集合属性缺少 javaType 或 resultMap 属性:该错误信息显示了 &q ...
- 每日一题力扣 1262 https://leetcode.cn/problems/greatest-sum-divisible-by-three/
. 题解 这道题目核心就算是要知道如果x%3=2的话,应该要去拿%3=1的数字,这样子才能满足%3=0 贪心 sum不够%3的时候,就减去余数为1的或者余数为2的 需要注意 两个余数为1会变成余数为2 ...
- Github秒变VSCode在线编辑器
在仓库页面 在网页地址中github后面加上 1s 即可
- ES 实战复杂sql查询、修改字段类型
转载请注明出处: 1.查询索引得 mapping 与 setting get 直接查询 索引名称时,会返回 该 索引得 mapping 和 settings 得配置,上述返回得结构如下: { &quo ...
- sudo:pam_open_session Permission denied 与 Too many open files
sudo:pam_open_session Permission denied 一,验证 sudo 权限失败: /etc/sudoers 文件未给相关用户配置权限. 打开 /etc/sudoers 文 ...
- 如何使用iptables防火墙模拟远程服务超时
前言 超时,应该是程序员很不爱处理的一种状态.当我们调用某服务.某个中间件.db时,希望对方能快速回复,正确就正常,错误就错误,而不是一直不回复.目前在后端领域来说,如java领域,调用服务时以同步阻 ...