上海浦东建筑建设网站,如何制作ppt视频教程,在线可以做翻译的网站,网页制作实训步骤序列化、反序列化 概述Jackson 序列化和反序列化简介自定义序列化器注册外部序列化程序#xff1a; 指定类的 Json 序列化、反序列化 主页传送门#xff1a;#x1f4c0; 传送 概述 序列化是将对象转换为字节序列的过程#xff0c;而反序列化则是将字节序列恢复为对象的过… 序列化、反序列化 概述Jackson 序列化和反序列化简介自定义序列化器注册外部序列化程序 指定类的 Json 序列化、反序列化 主页传送门 传送 概述 序列化是将对象转换为字节序列的过程而反序列化则是将字节序列恢复为对象的过程。在Java中序列化和反序
列化是通过实现Serializable接口来实现的。当一个类实现了Serializable接口时它的对象就可以被序列化和反序列化了 。
序列化最重要的作用是在传递和保存对象时保证对象的完整性和可传递性
Jackson 序列化和反序列化 简介 如果您使用 Jackson 来序列化和反序列化 JSON 数据您可能需要编写自己的JsonSerializer和JsonDeserializer类。自定义序列化器通常通过 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如果不适用甚至从头开始实现 通过调用addSpecificMapping或addGenericMapping添加映射从序列化的Class到JsonSerializer实例 自定义序列化程序工厂需要向ObjectMapper.setSerializerFactory注册才能由ObjectMapper使用
请注意从1.8开始CustomSerializerFactory 已被弃用不应使用。
示例 // Configuration of ObjectMapper:
{// First: need a custom serializer providerStdSerializerProvider sp new StdSerializerProvider();sp.setNullValueSerializer(new NullSerializer());// And then configure mapper to use itObjectMapper 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 JsonSerializerObject
{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 JsonSerializerMyObject {Overridepublic 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 JsonDeserializerMyObject {Overridepublic 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 。 如果喜欢的话欢迎 关注 点赞 评论 收藏 一起讨论你的支持就是我✍️创作的动力 序列化反序列化测试用例及替换默认Jackson库源码 序列化、反序列化测试
参考资料 Spring Boot json官方文档