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

在这里插入图片描述

主页传送门:📀 传送

概述


  序列化是将对象转换为字节序列的过程,而反序列化则是将字节序列恢复为对象的过程。在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 中的 JsonObjectSerializerJsonObjectDeserializer

在这里插入图片描述

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

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

参考资料
Spring Boot json官方文档

  • 68
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 108
    评论
好的,我可以回答你关于 Spring Boot 自定义序列化 Session 的问题。 在 Spring Boot 中,Session 默认使用 Java序列化方式进行存储。如果你想要自定义序列化方式,可以通过实现 Spring Session 的 Serializer 接口,并在配置文件中指定该序列化器来实现。 下面是一个使用 Kryo 序列化器的示例代码: 首先,在 pom.xml 文件中添加 Kryo 序列化器的依赖: ```xml <dependency> <groupId>com.esotericsoftware</groupId> <artifactId>kryo</artifactId> <version>5.1.1</version> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-core</artifactId> </dependency> ``` 然后,创建一个 KryoSerializer 类,实现 Serializer 接口,并实现相应的序列化反序列化方法,如下所示: ```java public class KryoSerializer<T> implements Serializer<T> { private final ThreadLocal<Kryo> kryos = ThreadLocal.withInitial(() -> { Kryo kryo = new Kryo(); kryo.setReferences(false); kryo.register(Session.class); return kryo; }); @Override public void serialize(T t, OutputStream outputStream) throws IOException { Kryo kryo = kryos.get(); Output output = new Output(outputStream); kryo.writeObject(output, t); output.close(); } @Override public T deserialize(InputStream inputStream) throws IOException { Kryo kryo = kryos.get(); Input input = new Input(inputStream); T t = (T) kryo.readObject(input, Session.class); input.close(); return t; } } ``` 最后,在 Spring Boot 的配置文件中指定使用 Kryo 序列化器,如下所示: ```properties spring.session.store-type=redis spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= spring.redis.timeout=10000 spring.session.redis.flush-mode=on_save spring.session.redis.namespace=spring:session spring.session.serializer.type=kryo ``` 以上就是关于 Spring Boot 自定义序列化 Session 的步骤,希望能帮到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 108
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

家有娇妻张兔兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值