当前位置:首页 > 行业动态 > 正文

springboot序列化和反序列化怎么定义

什么是序列化和反序列化

序列化是将一个对象的状态信息转换为字节流的过程,而反序列化则是将这个字节流恢复成对象的过程,在Java中,序列化主要用于持久化存储和网络传输,SpringBoot提供了两种序列化方式:JDK自带的序列化和Jackson序列化。

如何在SpringBoot中配置序列化和反序列化?

1、JDK自带序列化

在SpringBoot项目中,默认使用的是JDK自带的序列化方式,无需额外配置,只需在需要序列化的类上添加@Serializable注解即可。

springboot序列化和反序列化怎么定义

import java.io.Serializable;
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
} 

2、Jackson序列化

如果需要使用Jackson序列化,首先需要在项目的pom.xml文件中添加Jackson依赖:

springboot序列化和反序列化怎么定义

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency> 

然后在SpringBoot配置类中添加@EnableWebMvc注解,以启用Web MVC功能:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@EnableWebMvc
public class WebConfig {
} 

接下来,在需要使用Jackson序列化的类上添加@JsonSerialize@JsonDeserialize注解:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ObjectMapper;
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    // 其他属性和方法省略...
} 

创建一个自定义的ObjectMapper类,用于配置Jackson的序列化和反序列化规则:

springboot序列化和反序列化怎么定义

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.util.StdDateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class CustomObjectMapper extends ObjectMapper {
    public CustomObjectMapper() {
        SimpleModule module = new SimpleModule();
        module.addSerializer(Date.class, new ToStringSerializer(new SimpleDateFormat("yyyy-MM-dd")));
        module.addDeserializer(Date.class, new StdDeserializer<>(Date.class) {
            @Override
            protected Date _deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
                return parseDate(p);
            }
        });
        registerModule(module);
        configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }
} 

然后在SpringBoot配置类中创建一个CustomObjectMapper的Bean:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import java.util.Locale;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans importfactorybean;
import orgswingwwe34534534534534534534534534534534534534534534534534534534534534534534534534534534534534567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234x+y=z"; // 将x替换为实际的时间格式,将y替换为实际的日期格式,将z替换为实际的时区名称,如果不需要特定的格式,可以使用默认格式。