zl程序教程

您现在的位置是:首页 >  后端

当前栏目

SpringBoot中的序列化和反序列化器,如何成为史上最强“编解码大师”?

SpringBoot 如何 成为 序列化 史上 最强 大师 编解码
2023-09-14 09:04:56 时间

在这里插入图片描述

🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

一、SpringBoot中的序列化和反序列化器

在Spring Boot中,序列化和反序列化器是两个重要的组件,用于将Java对象转换为JSON或XML格式,并使应用程序能够在网络或不同应用程序之间进行数据交换。这篇文章将向您介绍Spring Boot中的序列化和反序列化器,以及它们在应用程序中扮演的角色。

1.1 什么是序列化和反序列化?

序列化和反序列化是将对象转换为可在网络或不同应用程序之间传递的格式(如JSON或XML),以及将其还原为对象的过程。序列化和反序列化在网络通信,caching和持久化等方面经常使用。

1.2 Spring Boot序列化和反序列化器

Spring Boot提供了一组序列化和反序列化器,允许将Java对象序列化为JSON或XML,并将其写入HTTP响应,或从HTTP请求读取并将其反序列化为Java对象。在Spring Boot应用程序中,以下两个注解用于配置对象的序列化器和反序列化器:

@JsonSerialize:指定对象的序列化器。
@JsonDeserialize:指定对象的反序列化器。

1.3 使用Jackson进行序列化和反序列化

Jackson是一种流行的Java库,用于将Java对象序列化为JSON或XML,并将其反序列化回Java对象。Spring Boot使用Jackson作为默认的序列化和反序列化库。

1.4 配置Jackson

要配置Jackson,您需要创建一个Jackson ObjectMapper bean。ObjectMapper是Jackson的主要类,用于将Java对象序列化为JsonNode或JSON字符串,并将JsonNode或JSON字符串反序列化为Java对象。

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.configure(JsonGenerator.Feature.IGNORE_UNKNOWN, true);
        return objectMapper;
    }
}

在这个例子中,我们创建了一个ObjectMapper bean,并配置它的一些选项。我们禁用了写日期作为时间戳的选项,并将其日期格式设置为"yyyy-MM-dd HH:mm:ss"。我们允许单引号作为字段名称,并禁用在反序列化时出现未知属性的选项。

提示:SpringBoot已经提供了默认的ObjectMapper,它可以满足大多数应用程序的需求。如果您不需要自定义ObjectMapper,则无需创建JacksonConfig类和相应的bean。

1.4.1 在控制器中使用Jackson

在Spring Boot中,您可以使用@JsonSerialize和@JsonDeserialize注解在JSON和Java对象之间切换。例如,您可以在Spring MVC控制器方法的参数或返回类型上使用这些注解。

@RestController
@RequestMapping("/example")
public class ExampleController {

    @PostMapping(value = "/serialize", consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Example> serialize(@RequestBody Example example) {
        return ResponseEntity.ok(example);
    }

    @PostMapping(value = "/deserialize", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Example> deserialize(@RequestParam("example") String example) throws IOException {
        Example object = objectMapper.readValue(example, Example.class);
        return ResponseEntity.ok(object);
    }
}

在这个例子中,我们创建了一个@Controller类,并在其中定义了两个方法,一个用于序列化,另一个用于反序列化。我们使用@JsonSerialize注解指定Example对象的序列化器,并在控制器方法的参数上使用@JsonDeserialize注解指定Example对象的反序列化器。

1.4.2 配置Spring Boot序列化和反序列化器

Spring Boot为常见的Java类型和标准库提供了默认的序列化和反序列化器,例如:

  1. @Jackson JSON

Jackson JSON是一个用Java编写的,流行的JSON处理库。它可以将Java对象转换成JSON格式的数据,并且也可以将JSON格式的数据转换成Java对象。由于Jackson具有快速、灵活和易于使用的特点,它被广泛用于Java应用程序和Web服务中。除了基本的对象序列化和反序列化功能,Jackson还提供了其他高级功能,例如JSON树模型、流API和数据绑定等。
Jackson JSON库在处理JSON数据方面有以下优点,包括:

  1. 高性能:Jackson JSON是一款高性能的JSON处理库,可以快速地序列化和反序列化Java对象和JSON数据。
  2. 灵活性:Jackson
    JSON支持多种数据格式,除了常规的JSON格式,还支持Smile、CBOR、YAML等格式,而且还支持多种数据处理方式,如基于树状结构的处理、基于流的处理、基于数据绑定的处理等。
  3. 易用性:Jackson
    JSON提供了很多简单易用的API和配置选项,可以方便地进行序列化和反序列化操作,而且可以根据需要进行自定义配置,提高了库的灵活性。
  4. 可扩展性:Jackson JSON提供了多种扩展功能,可用于增强和定制库的功能,如自定义序列化和反序列化器、自定义注释等。
  5. 社区活跃:Jackson JSON是一款流行的JSON处理库,拥有活跃的开发者社区,提供了大量的文档和示例,开发人员易于获取支持。
  1. @ Jackson XML

Jackson XML是一个基于Java的库,可用于XML与Java对象之间的相互转换。它是Jackson库的扩展,Jackson本身是一个流行的JSON处理库,但Jackson XML专门用于处理XML格式的数据。使用Jackson XML,开发人员可以轻松地将XML数据转换为Java对象,反之亦然,将Java对象转换为XML数据。Jackson XML具有以下优点:

  1. 高性能:Jackson XML提供了快速高效的序列化和反序列化功能。
  2. 易于使用:Jackson XML具有简单和直观的API和配置选项,开发人员可以轻松地对XML数据进行处理。
  3. 扩展性:Jackson XML提供了多种扩展功能,例如支持JAXB注释和XML继承等。
  4. 广泛的应用:Jackson XML被广泛应用于各种场景,如Web应用程序、数据存储、消息传递等。
  1. @ Protobuf
    Protobuf(Protocol Buffers)是一种由Google开发的高效、可扩展、跨语言的序列化框架,用于结构化数据的序列化和反序列化。它基于二进制流,将数据以紧凑的、高效的二进制格式进行编码,使得传输和存储的成本大大降低。
    以下是Protobuf的优点:

1.性能高:相比于其他序列化框架,Protobuf采用了二进制编码方式,以及使用了紧凑的编码方式,可以实现较高的编码效率,同时也降低了网络传输和存储的成本。
2.体积小:Protobuf序列化后的数据量比Xml和Json传输的数据量要小得多。
3.跨语言支持:Protobuf支持多种编程语言,并且能够实现不同语言之间的互相转换。 可拓展:Protobuf 的定义文件 protobuf
4.message支持向后和向前兼容,支持增加或者删除字段。 使用方便:Protobuf提供了良好的IDL(Interface
5.Description Language)支持,开发者指定好数据格式后,通过protoc编译器即可自动生成客户端和服务端需要依赖的代码。
6.总的来说,Protobuf 是一款大规模数据结构的序列化和反序列化的工具,对于对性能要求较高,需要处理大量数据的应用场景非常适合。

您可以使用Spring Boot的配置属性为这些序列化器进行配置。以下是Spring Boot配置属性的示例:

spring.jackson.default-property-inclusion=non_null
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.serialization.fail-on-empty-beans=false
spring.jackson.deserialization.fail-on-unknown-properties=false

在这个例子中,我们配置了Spring Boot的默认Jackson序列化器。我们指定了默认属性包含为non_null,并将日期格式设置为"yyyy-MM-dd HH:mm:ss"。我们禁用了空bean的序列化失败选项,并禁用了反序列化的未知属性失败选项。

二、结论

使用Spring Boot的序列化和反序列化器,您可以轻松地将Java对象转换为JSON或XML格式,并使应用程序能够在网络或不同应用程序之间进行数据交换。在这篇文章中,我们向您介绍了Spring Boot中的序列化和反序列化器,以及如何使用Jackson进行序列化和反序列化。现在,您可以在Spring Boot应用程序中轻松地使用序列化和反序列化器了!