java---序列化和返序列化

311 阅读2分钟
  • 反序列化:把字节序列恢复为Java对象的过程。(前端请求接口,传入json数据,后端反序列化为java对象的过程)
  • 序列化:把Java对象转换为字节序列的过程。(后端序列化java对象转化为字节的过程)
  • 序列化和反序列化的常用方式

方式1 @JsonDeserialize @JsonSerialize注解, 方便局部的字段处理。

  • 1.1接收前端请求
@PostMapping("/insert")
public UserForm userInsert(@RequestBody UserForm form) {
    log.info("form:{}",JSON.toJSONString(form));
    return form;
}
  • 1.2在需要序列化和反序列化的字段上加上@JsonDeserialize @JsonSerialize
package com.my.demo.model.form;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.my.demo.serializer.DateDeSerialize;
import com.my.demo.serializer.DateSerialize;
import lombok.Data;

import java.util.Date;

@Data
public class UserForm {
    @JsonDeserialize(using = DateDeSerialize.class)
    @JsonSerialize(using = DateSerialize.class)
    private Date joinDate;
}
  • 1.3 自定义序列化和反序列化的类, 分别继承StdDeserializer StdSerializer
package com.my.demo.serializer;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.my.demo.utils.DateUtil;

import java.io.IOException;
import java.util.Date;

public class DateDeSerialize extends StdDeserializer<Date> {

    protected DateDeSerialize(Class<?> vc) {
        super(vc);
    }

    public DateDeSerialize() {
        this(null);
    }

    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        String text = p.getText();
        return DateUtil.parseDate(text);
    }
}


package com.my.demo.serializer;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.my.demo.utils.DateUtil;

import java.io.IOException;
import java.util.Date;

public class DateSerialize extends StdSerializer<Date> {
    
    protected DateSerialize(Class<Date> t) {
        super(t);
    }
    protected DateSerialize() {
        this(null);
    }

    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        String s = DateUtil.formatDate(value, "yyyy-MM-dd");
        gen.writeString(s);
    }
}

方式2 @Configuration配置全局的序列化和反序列化

  • 2.1 字段定义好类型
package com.my.demo.model.form;

import lombok.Data;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

@Data
public class UserForm {
    private LocalDateTime joinDateTime;
    private LocalDate joinDate;
    private LocalTime joinTime;
}
  • 2.2 全局配置好序列化和反序列化bean
package com.my.demo.common.config;

import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

@Configuration
public class ParamSerializeConfig {

    private static final String LOCAL_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    private static final String LOCAL_DATE = "yyyy-MM-dd";
    private static final String LOCAL_TIME = "HH:mm:ss";

    /**
     * 使用:
     *    前端入参返参都是字符串  yyyy-MM-dd HH:mm:ss
     *    后端接收             LocalDateTime
     *    后端返参是字符串      yyyy-MM-dd HH:mm:ss
     * body 入参返序列化/返参序列化 自动转换器
     * @return Jackson2ObjectMapperBuilderCustomizer
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer builderCustomizer(){
        return bulider -> {
            bulider.serializerByType(LocalDateTime.class, localDateTimeSerializer());
            bulider.deserializerByType(LocalDateTime.class, localDateTimeDeserializer());
            bulider.serializerByType(LocalDate.class, localDateSerializer());
            bulider.deserializerByType(LocalDate.class, localDateDeserializer());
            bulider.serializerByType(LocalTime.class, localTimeSerializer());
            bulider.deserializerByType(LocalTime.class, localTimeDeserializer());
        };
    }

    @Bean
    public static LocalDateTimeSerializer localDateTimeSerializer(){
        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(LOCAL_DATE_TIME_FORMAT));
    }

    @Bean
    public static LocalDateTimeDeserializer localDateTimeDeserializer(){
        return new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(LOCAL_DATE_TIME_FORMAT));
    }

    @Bean
    public static LocalDateSerializer localDateSerializer(){
        return new LocalDateSerializer(DateTimeFormatter.ofPattern(LOCAL_DATE));
    }

    @Bean
    public static LocalDateDeserializer localDateDeserializer(){
        return new LocalDateDeserializer(DateTimeFormatter.ofPattern(LOCAL_DATE));
    }

    @Bean
    public static LocalTimeSerializer localTimeSerializer(){
        return new LocalTimeSerializer(DateTimeFormatter.ofPattern(LOCAL_TIME));
    }

    @Bean
    public static LocalTimeDeserializer localTimeDeserializer(){
        return new LocalTimeDeserializer(DateTimeFormatter.ofPattern(LOCAL_TIME));
    }
}
  • 2.3 成功结果截图

image.png