Spring Boot 序列化、反序列化

Spring Boot 序列化、反序列化

1. 简介

在软件开发中,序列化和反序列化是一种将对象转换为字节流以便存储或传输的机制。序列化将对象转换为字节流,而反序列化则将字节流转换为对象。序列化和反序列化在许多应用场景中都起着重要的作用,比如在网络通信中传输对象、将对象存储到数据库中、实现分布式缓存等。

2. Java中的序列化和反序列化

Java提供了默认的序列化机制,可以通过实现Serializable接口来实现对象的序列化和反序列化。序列化的过程是将对象转换为字节流,可以通过ObjectOutputStream类来实现;反序列化的过程是将字节流转换为对象,可以通过ObjectInputStream类来实现。在进行序列化和反序列化时,需要注意一些事项,比如版本控制、字段的访问控制等。

import java.io.*;public class SerializationDemo {public static void main(String[] args) {// 序列化对象try {// 创建一个对象User user = new User("John", 25);// 创建一个输出流FileOutputStream fileOut = new FileOutputStream("user.ser");// 创建一个对象输出流ObjectOutputStream out = new ObjectOutputStream(fileOut);// 将对象写入输出流out.writeObject(user);// 关闭流out.close();fileOut.close();System.out.println("Serialized data is saved in user.ser");} catch (IOException e) {e.printStackTrace();}// 反序列化对象try {// 创建一个输入流FileInputStream fileIn = new FileInputStream("user.ser");// 创建一个对象输入流ObjectInputStream in = new ObjectInputStream(fileIn);// 从输入流中读取对象User user = (User) in.readObject();// 关闭流in.close();fileIn.close();// 输出对象的属性System.out.println("Name: " + user.getName());System.out.println("Age: " + user.getAge());} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}class User implements Serializable {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}

3. Spring Boot中的序列化和反序列化

在Spring Boot中,默认使用Jackson库进行JSON的序列化和反序列化。可以通过配置文件或注解来自定义序列化和反序列化的规则。比如,可以使用@JsonSerialize注解来指定对象的序列化规则,使用@JsonDeserialize注解来指定对象的反序列化规则。

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;@SpringBootApplication
public class SerializationApplication {public static void main(String[] args) {SpringApplication.run(SerializationApplication.class, args);}@Beanpublic Jackson2ObjectMapperBuilderCustomizer customizer() {return new Jackson2ObjectMapperBuilderCustomizer() {@Overridepublic void customize(Jackson2ObjectMapperBuilder builder) {builder.serializationInclusion(JsonInclude.Include.NON_NULL);builder.visibility(JsonAutoDetect.Visibility.ANY);}};}@Beanpublic ObjectMapper objectMapper() {ObjectMapper objectMapper = new ObjectMapper();objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);return objectMapper;}
}

4. 序列化和反序列化的安全性问题

序列化和反序列化操作可能存在安全漏洞,攻击者可以通过构造恶意的序列化数据来执行任意代码。这种攻击被称为"序列化漏洞"。为了防止序列化漏洞,可以采取以下措施:

  • 使用白名单机制,限制可以反序列化的类;
  • 对反序列化的数据进行校验,确保数据的完整性和安全性;
  • 使用安全的序列化库,如Google的Protobuf。

在Spring Boot中,可以通过配置来增强序列化和反序列化的安全性。比如,可以禁用默认的序列化机制,限制可以反序列化的类,或者使用安全的序列化库。

5. 序列化和反序列化的最佳实践

在实际应用中,选择合适的序列化和反序列化方式非常重要。以下是一些最佳实践:

  • 尽量使用标准的序列化机制,如Java的序列化机制或JSON序列化;
  • 对于复杂的对象,考虑使用自定义的序列化和反序列化规则;
  • 注意对象的版本控制,避免出现不兼容的问题;
  • 进行性能评估,选择性能较好的序列化方式。

6. 总结

序列化和反序列化是一种重要的机制,在软件开发中起着重要的作用。本文介绍了Java中的序列化和反序列化机制,以及在Spring Boot中的应用。同时,还讨论了序列化和反序列化的安全性问题和最佳实践。希望本文对读者在实际开发中的序列化和反序列化问题有所帮助。

7. 参考文献

  • Java Serialization
  • Spring Boot Reference Guide
  • Serialization and Deserialization in Java
  • Secure Coding Guidelines for Java SE

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

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

相关文章

基于opencv与机器学习的摄像头实时识别数字!附带完整的代码、数据集和训练模型!!

前言 使用摄像头实时识别数字算是目标检测任务,总体上分为两步,第一步是检测到数字卡片的位置,第二步是对检测到的数字卡片进行分类以确定其是哪个数字。在第一步中主要涉及opencv的相关功能,第二步则使用机器学习的方式进行分类…

源码学习初章-基础知识储备

文章目录 学前准备源码地址引言extern "C" 宏定义平台宏跨平台宏vstdio平台禁用警告宏 连接、双层宏定义函数宏系统函数宏自定义函数宏多语句执行宏do while0 普通宏定义 C的一些必备函数知识回调函数和函数指针回调函数wireshark-4.0.7源码例子函数指针wireshark4.0…

通讯录的实现(超详细)——C语言(进阶)

目录 一、创建联系人信息(结构体) 二、创建通讯录(结构体) 三、define定义常量 四、打印通讯录菜单 五、枚举菜单选项 六、初始化通讯录 七、实现通讯的的功能 7.1 增加加联系人 7.2 显示所有联系人的信息 ​7.3 单独查…

《MySQL45讲》笔记—索引

索引 索引是为了提高数据查询效率,就像书的目录一样。如下图,索引和数据就是位于存储引擎中: 索引常见模型 哈希表 以键值对存储的数据结构。适用于只有等值查询的场景。 有序数组 在等值查询和范围查询场景中性能都特别优秀。但是有…

开放自动化软件的硬件平台

自动化行业的产品主要以嵌入式系统为主,历来对产品硬件的可靠性和性能都提出很高的要求。最典型的产品要数PLC。PLC 要求满足体积小,实时性,可靠性,可扩展性强,环境要求高等特点。它们通常采用工业级高性能嵌入式SoC 实…

Vue 3:玩一下web前端技术(三)

前言 本章内容为VUE工作过程与相关使用讨论。 上一篇文章地址: Vue 3:玩一下web前端技术(二)_Lion King的博客-CSDN博客 下一篇文章地址: Vue 3:玩一下web前端技术(四)_Lion Ki…

云计算结合数据科学突破信息泛滥(上)

大家好,本文将讨论有助于成功扩展数据科学项目的关键组成部分,涵盖了如何使用API采集数据,如何在云中存储数据,如何清理和处理数据,如何将数据可视化,以及如何通过交互式仪表盘来利用数据可视化的力量。 数…

SpringBoot 注解

SpringBoot SpringBoot(SpringBootApplication)问题引入我们的工程在引入spring-boot-starter-web依赖的时候,为什么没有指定版本(版本锁定)spring-boot-starter-web是个啥,为什么引入了它之后,…

【业务功能篇59】Springboot + Spring Security 权限管理 【下篇】

UserDetails接口定义了以下方法: getAuthorities(): 返回用户被授予的权限集合。这个方法返回的是一个集合类型,其中每个元素都是一个GrantedAuthority对象,表示用户被授予的权限。getPassword(): 返回用户的密码。这个方法返回的是一个字符…

C#通过请求url调用接口返回数据

方法描述:通过请求url,调用对方系统的接口,拿到数据并返回; 方法参数:访问系统的url地址 url请求参数:searchDate(当前请求的年月:2023-7),需进行url编码 …

springboot编写mp4视频播放接口

简单粗暴方式 直接读取指定文件,用文件流读取视频文件,输出到响应中 GetMapping("/display1/{fileName}")public void displayMp41(HttpServletRequest request, HttpServletResponse response,PathVariable("fileName") String fi…

stm32通过ESP8266接入原子云

1. ESP8266模块需要烧录原子云固件,此原子云固件和正常的ESP8266固件相比添加了ATATKCLDSTA 和 ATATKCLDCLS 这两条指令: 2. 原子云账号注册及设备建立 设备管理-新增设备-ESP8266 新建设备后新建分组,将设备加入到此分组中: 至此…

ICASSP 2023 | Cough Detection Using Millimeter-Wave FMCW Radar

原文链接:https://mp.weixin.qq.com/s?__bizMzg4MjgxMjgyMg&mid2247486540&idx1&sn6ebd9f58e9f08a369904f9c48e12d136&chksmcf51beb5f82637a3c65cf6fa53e8aa136021e35f63a58fdd7154fc486a285ecde8b8521fa499#rd ICASSP 2023 | Cough Detection Usi…

Vue3和Vue2的差异总结对比(含代码案例)

目录 Composition API(组合式 API) setup() 函数 ref 和 reactive Teleport 组件 Fragment 组件 全局 API 改变 V-model 的改进 编译器优化 响应式系统改进 更好的类型推导和支持 更好的性能 Composition API(组合式 API&#xff…

SwipeDelMenuLayout失效:Could not find SwipeDelMenuLayout-V1.3.0.jar

一、问题描述 最近在工作上的项目中接触到SwipeDelMenuLayout这个第三方Android开发库,然后我就根据网上的教程进行配置。这里先说一下我的开发环境:Android Studio版本是android-studio-2020.3.1.24-windows,gradle版本是7.0.2。 首先是在se…

RWEQ模型——土壤风蚀模拟

详情点击链接:基于“RWEQ”集成技术在土壤风蚀模拟与风蚀模数估算、变化归因分析中的实践应用及SCI论文撰写 前沿 土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一,土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的…

【Docker】Docker应用部署之Docker容器安装Tomcat

目录 一、搜索镜像 二、拉取镜像 三、创建容器 四、测试使用 一、搜索镜像 docker search tomcat 二、拉取镜像 docker pull tomcat:版本 三、创建容器 首先在宿主机创建数据卷的目录 mkdir /root/tomcat # 创建目录 cd /root/tomcat # 进入目录 docker run -id -…

前端框架学习-Vue(二)

最近在学习Vue框架,Vue中的内容很多。相当于把之前后端的MVC,V层转移到前端来编写和部署。下面是学习Vue时的大纲。 Vue生命周期是Vue应用的生命周期Vue脚手架,即vue-cli,使用node.js 来创建和启动vue项目Vue组件知识,…

RS485/RS232自由转ETHERNET/IP网关profinet和ethernet区别

你是否曾经遇到过这样的问题:如何将ETHERNET/IP网络和RS485/RS232总线连接起来呢?捷米的JM-EIP-RS485/232通讯网关,自主研发的ETHERNET/IP从站功能,完美解决了这个难题。这款网关不仅可以将ETHERNET/IP网络和RS485/RS232总线连接起…

Zynq-Linux移植学习笔记之62- PL挂载复旦微flash

1、背景介绍 现在为了全国产化需要,之前所有的进口flash全部要换成国产flash 2、复旦微flash型号 其中EFM25QU256和EFM25QL256对标winbond的w25q256 nor flash 3、FPGA设置 复旦微flash只支持单线模式,当使用PL侧的IP核访问时,需要设置模式…