【Spring Boot丨序列化、反序列化】

这篇具有很好参考价值的文章主要介绍了【Spring Boot丨序列化、反序列化】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Spring Boot丨序列化、反序列化】,# Spring Boot,spring boot,后端,java,序列化

主页传送门:📀 传送

概述


  序列化是将对象转换为字节序列的过程,而反序列化则是将字节序列恢复为对象的过程。在Java中,序列化和反序

列化是通过实现Serializable接口来实现的。当一个类实现了Serializable接口时,它的对象就可以被序列化和反序列化了 。

序列化最重要的作用是在传递和保存对象时保证对象的完整性和可传递性

Jackson 序列化和反序列化


简介

  如果您使用 Jackson 来序列化和反序列化 JSON 数据,您可能需要编写自己的JsonSerializerJsonDeserializer类。自定义序列化器通常通过 module 向 Jackson 注册。

自定义序列化器

俩种实现方法:

  • 使要序列化的值、类实现接口org.codehaus.jackson.map.JsonSerializedWithType :这与实现java.lang.Serialized类似,调用值类的serialize()方法 来处理序列化。
    • 注意:在 Jackson 1.5之前,推荐的接口是org.codehaus.jackson.map.JsonSerialized ;但现在已废弃,因为它不支持处理可能的附加类型信息(有关详细信息,请参阅JacksonPolymorphicDeserialization)。
    • 如果选择使用此方法,请考虑从部分实现开始,例如org.codehaus.jackson.map.ser.SerializerBase(适用于任何类型)或org.codehaus.jackson.map.ser.ScalarSerializerBase(适用于输出JSON字符串、布尔值或数字的序列化程序,也称为标量类型)
  • 实现org.codehaus.jackson.map.JsonSerializer来创建一个外部序列化器,该程序可以注册以处理某些类型的值(或者更具体地说,某些属性的值)

注册外部序列化程序:

  • 使用注释

  • 类和方法可以使用@JsonSerialize.using(将序列化程序类作为参数)进行注释,以指示要使用的序列化程序的类型

使用Jackson 1.7及以上版本

  Jackson 1.7添加了通过Module 接口注册序列化器和反序列化的能力。这是添加自定义序列化程序的推荐方法——所有序列化程序都被视为“通用”,因为除非找到更具体的绑定,否则它们都用于子类型。

示例:

 ObjectMapper mapper = new ObjectMapper();
 SimpleModule testModule = new SimpleModule("MyModule", new Version(1, 0, 0, null));
 testModule.addSerializer(new MyCustomSerializer()); // 假设序列化程序声明了要绑定到的正确类
 mapper.registerModule(testModule);

  为了更高级地处理序列化程序的类型,您可能需要直接实现Module接口;这将提供对精确匹配逻辑的更多控制。在处理泛型类型(尤其是映射和集合)时,这可能是必要的。

Jackson 1.7之前

主要方法:

  • 通过使用自定义序列化程序工厂(org.codehaus.jackson.map.SerizerFactory)

    • 使用或扩展现有的实现,org.codehaus.ackson.map.ser.CustomSerializerFactory(如果不适用,甚至从头开始实现)

    • 通过调用addSpecificMappingaddGenericMapping添加映射(从序列化的Class到JsonSerializer实例)

    • 自定义序列化程序工厂需要向ObjectMapper.setSerializerFactory注册才能由ObjectMapper使用

请注意,从1.8开始,CustomSerializerFactory 已被弃用,不应使用。

示例:


// Configuration of ObjectMapper:
{
   // First: need a custom serializer provider
   StdSerializerProvider sp = new StdSerializerProvider();
   sp.setNullValueSerializer(new NullSerializer());
   // And then configure mapper to use it
   ObjectMapper m = new ObjectMapper();
   m.setSerializerProvider(sp);
   // Serialization as done using regular ObjectMapper.writeValue()
}

// and NullSerializer can be something as simple as:
public class NullSerializer extends JsonSerializer<Object>
{
   public void serialize(Object value, JsonGenerator jgen,
SerializerProvider provider)
       throws IOException, JsonProcessingException
   {
       // any JSON value you want...
       jgen.writeString("");
   }
}

指定类的 Json 序列化、反序列化


   Spring Boot 提供了另一种 @JsonComponent 注释,可以更容易地直接注册 Spring Beans。
可以直接在 JsonSerializer JsonDeserializer 实现上使用@JsonComponent注释。您还可以在包含序列化程序/反序列化程序作为内部类的类上使用它

import java.io.IOException;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import org.springframework.boot.jackson.JsonComponent;

@JsonComponent
public class MyJsonComponent {

    public static class Serializer extends JsonSerializer<MyObject> {

        @Override
        public void serialize(MyObject value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
            jgen.writeStartObject();
            jgen.writeStringField("name", value.getName());
            jgen.writeNumberField("age", value.getAge());
            jgen.writeEndObject();
        }

    }

    public static class Deserializer extends JsonDeserializer<MyObject> {

        @Override
        public MyObject deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException {
            ObjectCodec codec = jsonParser.getCodec();
            JsonNode tree = codec.readTree(jsonParser);
            String name = tree.get("name").textValue();
            int age = tree.get("age").intValue();
            return new MyObject(name, age);
        }

    }

}


ApplicationContext 中的所有 @JsonComponent bean 都会自动注册到 Jackson。因为 @JsonComponent 是使用 @Component 进行元注释的,所以通常的组件扫描规则适用。

Spring Boot 还提供了 JsonObjectSerializer JsonObjectDeserializer 基类,它们在序列化对象时提供了标准 Jackson 版本的有用替代方法。有关详细信息,请参阅 Javadoc 中的 JsonObjectSerializer 和 JsonObjectDeserializer 。

【Spring Boot丨序列化、反序列化】,# Spring Boot,spring boot,后端,java,序列化

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论
  你的支持就是我✍️创作的动力!					  💞💞💞

序列化反序列化测试用例及替换默认Jackson库源码:
序列化、反序列化测试

参考资料
Spring Boot json官方文档文章来源地址https://www.toymoban.com/news/detail-617389.html

到了这里,关于【Spring Boot丨序列化、反序列化】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring反序列化JNDI分析

    Spring框架的 JtaTransactionManager 类中重写了 readObject 方法,这个方法最终会调用到JNDI中的 lookup() 方法,关键是里面的参数可控,这就导致了攻击者可以利用JNDI注入中的lookup()参数注入,传入恶意URI地址指向攻击者的RMI注册表服务,以使受害者客户端加载绑定在攻击者RMI注册表服

    2024年04月08日
    浏览(42)
  • 【中危】Spring Kafka 反序列化漏洞 (CVE-2023-34040)

    zhi.oscs1024.com​​​​​ 漏洞类型 反序列化 发现时间 2023-08-24 漏洞等级 中危 MPS编号 MPS-fed8-ocuv CVE编号 CVE-2023-34040 漏洞影响广度 小 OSCS 描述 Spring Kafka 是 Spring Framework 生态系统中的一个模块,用于简化在 Spring 应用程序中集成 Apache Kafka 的过程,记录(record)指 Kafka 消息中的一

    2024年02月11日
    浏览(51)
  • 微信小程序的授权登录-Java 后端 (Spring boot)

    微信开发文档链接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 一个可以测试的微信小程序 此微信小程序的APPID和APPscret(至开发者后台获取) 从时序图我们可以了解到流程大致分为两步: 小程序端获取code后传给Java后台 Java后台获取code后向微信后台接口

    2024年02月09日
    浏览(53)
  • “从零开始学习Spring Boot:快速搭建Java后端开发环境“

    标题:从零开始学习Spring Boot:快速搭建Java后端开发环境 摘要:本文将介绍如何从零开始学习Spring Boot,并详细讲解如何快速搭建Java后端开发环境。通过本文的指导,您将能够快速搭建一个基于Spring Boot的Java后端开发环境并开始编写代码。 正文: 一、准备工作 在开始之前,

    2024年02月15日
    浏览(55)
  • 【Linux后端服务器开发】协议定制(序列化与反序列化)

    目录 一、应用层协议概述 二、序列化与反序列化 Protocal.h头文件 Server.h头文件 Client.h头文件 server.cpp源文件 client.cpp源文件 什么是应用层 ?我们通过编写程序解决一个个实际问题、满足我们日常需求的网络程序,都是应用层程序。 协议是一种“约定”,socket的api接口,在读

    2024年02月16日
    浏览(40)
  • 后端项目开发:工具类封装(序列化、反射)

    根据《阿里巴巴开发规范》,包名使用单数,类名可以使用复数。 所以generic-common创建util包和utils工具类 很多时候我们需要将接收到的json数据转换为对象,或者将对象转为json存储。这时候我们需要编写用于json转换的工具类。 新建util目录,再创建JacksonUtils类

    2024年02月11日
    浏览(36)
  • Spring Boot 整合 Shiro(后端)

    1 Shiro 什么是 Shiro 官网: http://shiro.apache.org/ 是一款主流的 Java 安全框架,不依赖任何容器,可以运行在 Java SE 和 Java EE 项目中,它的主要作用是对访问系统的用户进行身份认证、 授权、会话管理、加密等操作。 Shiro 就是用来解决安全管理的系统化框架。 2 Shiro 核心组件 用

    2024年02月09日
    浏览(49)
  • Android前端+Spring Boot后端 登录功能实现

    创建项目后,自己添加包,框架如下   userController里的一些内容,只供参考,代码不全,无法实现 数据库是直接在社区版IDEA里连接Mysql,在控制台端创建的数据库和user表,用于数据交互。 Activity包里是Activity Java类,主要响应layout包里activity_login.xml等页面布局内的按钮响应 a

    2024年02月12日
    浏览(66)
  • Java序列化和反序列化

    目录 一、序列化和反序列化 二、Java序列化演示 三、反序列化漏洞 1、含义 ​序列化就是内存中的对象写入到IO流中,保存的格式可以是二进制或者文本内容。反序列化就是IO流还原成对象。 2、用途 (1)传输网络对象 (2)保存Session 1、序列化 java.io.ObjectOutputStream代表对象

    2023年04月25日
    浏览(37)
  • Spring boot MongoDB实现自增序列

    在某些特定的业务场景下,会需要使用自增的序列来维护数据,目前项目中因为使用MongoDB,顾记录一下如何使用MongoDB实现自增序列。 MongoDB自增序列原理 MongoDB本身不具有自增序列的功能,但是MongoDB的 $inc 操作是具有原子性的,因为操作的原子性,那么就可以通过 $inc 序列

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包