首页 > 其他分享 >ObjectMapper和ObjectSerializer的使用方法及区别

ObjectMapper和ObjectSerializer的使用方法及区别

时间:2023-10-11 14:56:42浏览次数:32  
标签:Java 区别 supportMediaTypeList MediaType ObjectSerializer JSON import 序列化 ObjectMa

ObjectMapper和ObjectSerializer

ObjectMapper和ObjectSerializer是两个常用的Java序列化工具,它们的主要区别在于序列化和反序列化的方式以及支持的数据格式。

ObjectMapper是Jackson库中的一个类,用于将Java对象序列化为JSON格式或将JSON格式反序列化为Java对象。它支持多种数据格式,包括JSON、XML、YAML等。ObjectMapper可以将Java对象转换为JSON字符串,也可以将JSON字符串转换为Java对象。使用ObjectMapper时,需要将Jackson库添加到项目的依赖中。

ObjectMapper的使用方法如下:

ObjectMapper objectMapper = new ObjectMapper();
// 将Java对象序列化为JSON字符串
String json = objectMapper.writeValueAsString(obj);
// 将JSON字符串反序列化为Java对象
Object obj = objectMapper.readValue(json, Object.class);

 

ObjectSerializer是Fastjson库中的一个接口,用于将Java对象序列化为JSON格式或将JSON格式反序列化为Java对象。它只支持JSON格式,并且比ObjectMapper更快,但是在一些特殊情况下可能会存在安全问题。使用ObjectSerializer时,需要将Fastjson库添加到项目的依赖中。

ObjectSerializer的使用方法如下:

ObjectSerializer serializer = new JSONSerializer();
// 将Java对象序列化为JSON字符串
String json = serializer.serialize(obj);
// 将JSON字符串反序列化为Java对象
Object obj = serializer.deserialize(json);

总的来说,ObjectMapper和ObjectSerializer都是常用的Java序列化工具,使用方法类似,但是ObjectMapper支持更多的数据格式,而ObjectSerializer更快。选择使用哪一个工具,需要根据具体的需求和项目情况来决定。

 

SerializeWriter和ObjectSerializer

SerializeWriter和ObjectSerializer是阿里巴巴的fastjson库中的两个重要类。

SerializeWriter是一个字符流,用于序列化Java对象为JSON格式的字符串。它提供了一些方法,如writeInt,writeString,writeObject等,用于将Java对象的属性写入到JSON字符串中。

ObjectSerializer是一个接口,用于将Java对象序列化为JSON格式的字符串。它定义了一个方法:void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features),其中serializer是JSON序列化器,object是需要序列化的Java对象,fieldName是对象的属性名,fieldType是属性的类型,features是序列化的特性。

在fastjson库中,当需要将Java对象序列化为JSON字符串时,会先创建一个SerializeWriter对象,然后使用ObjectSerializer将Java对象序列化为JSON格式的字符串,并将结果写入SerializeWriter中。最终,SerializeWriter中的字符流就是序列化后的JSON字符串。

 

ObjectSerializer实现日期格式化

1、自定义类实现ObjectSerializer接口

import cn.hutool.core.date.DatePattern;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.lang.reflect.Type;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Component
public class LocalDateTimeToTimestampSerializer implements ObjectSerializer {

    public static final LocalDateTimeToTimestampSerializer instance = new LocalDateTimeToTimestampSerializer();
    private static final String defaultPattern = DatePattern.NORM_DATETIME_PATTERN;

    public LocalDateTimeToTimestampSerializer() {
    }

    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        SerializeWriter out = serializer.out;
        if (object == null) {
            out.writeNull();
        } else {
            LocalDateTime result = (LocalDateTime) object;
            // 转换为yyyy-MM-dd HH:mm:ss格式
            out.writeString(result.format(DateTimeFormatter.ofPattern(defaultPattern)));
        }
    }
}

2、自定义配置类WebMvcConfig实现WebMvcConfigurer,并重写configureMessageConverters方法

package com.midea.fap.aic.query.starter.config;

import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * @version 1.0
 * @description:
 * @date 2023-04-26 13:52
 */
@Configuration
@Order(-1)
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/swagger-ui/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
                .resourceChain(false);
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/swagger-ui/").setViewName("/swagger-ui/index.html");
    }

    /**
     * JSON-转换器
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
        converters.removeIf(MappingJackson2HttpMessageConverter.class::isInstance);

        SerializeConfig serializeConfig = SerializeConfig.globalInstance;
        // 注入自定义LocalDateTime处理器
        serializeConfig.put(LocalDateTime.class, LocalDateTimeToTimestampSerializer.instance);

        FastJsonConfig config = new FastJsonConfig();
        config.setSerializeConfig(serializeConfig);
        config.setSerializerFeatures(SerializerFeature.PrettyFormat);

        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        fastJsonHttpMessageConverter.setSupportedMediaTypes(getSupportMediaTypes());
        fastJsonHttpMessageConverter.setFastJsonConfig(config);

        converters.add(fastJsonHttpMessageConverter);
    }

    /**
     * 配置MediaType
     * @return List<MediaType>
     */
    public static List<MediaType> getSupportMediaTypes() {
        List<MediaType> supportMediaTypeList = new ArrayList<>();
        supportMediaTypeList.add(MediaType.APPLICATION_JSON);
        supportMediaTypeList.add(MediaType.APPLICATION_ATOM_XML);
        supportMediaTypeList.add(MediaType.APPLICATION_FORM_URLENCODED);
        supportMediaTypeList.add(MediaType.APPLICATION_OCTET_STREAM);
        supportMediaTypeList.add(MediaType.APPLICATION_PDF);
        supportMediaTypeList.add(MediaType.APPLICATION_RSS_XML);
        supportMediaTypeList.add(MediaType.APPLICATION_XHTML_XML);
        supportMediaTypeList.add(MediaType.APPLICATION_XML);
        supportMediaTypeList.add(MediaType.IMAGE_GIF);
        supportMediaTypeList.add(MediaType.IMAGE_JPEG);
        supportMediaTypeList.add(MediaType.IMAGE_PNG);
        supportMediaTypeList.add(MediaType.TEXT_EVENT_STREAM);
        supportMediaTypeList.add(MediaType.TEXT_HTML);
        supportMediaTypeList.add(MediaType.TEXT_MARKDOWN);
        supportMediaTypeList.add(MediaType.TEXT_PLAIN);
        supportMediaTypeList.add(MediaType.TEXT_XML);
        return supportMediaTypeList;
    }
}

 

标签:Java,区别,supportMediaTypeList,MediaType,ObjectSerializer,JSON,import,序列化,ObjectMa
From: https://www.cnblogs.com/huangdh/p/17757079.html

相关文章

  • 晶体(crystal)和晶振(oscillator)的区别
    1.晶振与晶体的区别1)晶振是有源晶振的简称,又叫振荡器。英文名称是oscillator。晶体则是无源晶振的简称,也叫谐振器。英文名称是crystal.2)无源晶振(晶体)一般是直插两个脚的无极性元件,需要借助时钟电路才能产生振荡信号。常见的有49U、49S封装。3)有源晶振(晶振)一般是表贴......
  • 【React】React.memo与useMemo的区别和联系
    概述React.memo和useMemo都是React进行性能优化的手段,它们允许我们缓存需要进行高性能计算的结果,以便下次渲染页面时,返回缓存的值而不必重新计算函数,从而确保我们的应用程序运行的更快,避免不必要的开销。React.memo详解为什么memo(memoization的简写)在React中这么重要呢?在......
  • Java 中 extends 与implements 的区别 ?
    一、介绍extends与implements的概念1、类与类之间的继承使用extends:子类extends父类的属性和方法,并且进行扩展或者重写。//父类classAnimal{publicvoideat(){System.out.println("Animaliseating");}publicvoidnoeat(){......
  • 【Python深度学习】目标检测和语义分割的区别
    ​        在计算机视觉领域,语义分割和目标检测是两个关键的任务,它们都是对图像和视频进行分析,但它们之间存在着明显的区别。本文将通过图像示例,详细阐述语义分割和目标检测之间的差异。一、基本概念        1.1语义分割(SemanticSegmentation)      ......
  • 编译型编程语言与解释型编程语言的区别
    我们先看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler)。如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会直接生成一......
  • 单步指令区别step next stepi nexti
    https://blog.csdn.net/weixin_43092232/article/details/106243657https://blog.csdn.net/www_dong/article/details/117374370 代码验证:龙芯3A5000验证$cattest.c#include<stdio.h>intadd(intd1,intd2){intd;d=d1+1;d=d+d2+2;retu......
  • VM:桥接、NAT、仅主机的区别
    学习自:桥接模式、NAT模式、仅主机(HostOnly)模式的区别_程序员爱德华的博客-CSDN博客VM虚拟机的三种网络连接模式,桥接,NAT,仅主机区别。VMware的三种网络模式-知乎1、网络类型虚拟机建立时的常见网络类型有3种:桥接、NAT(NetworkAddressTranslation,网络地址转换)、仅主机(Host......
  • @GetMapping、@PostMapping、@PutMapping、@DeleteMapping 的区别?
    对于@GetMapping、@PostMapping、@PutMapping、@DeleteMapping,首先我们得谈到RESTFUL风格接口,常用的URL请求方式就包括了GET、POST、PUT、DELETE等:谈到@GetMapping、@PostMapping、@PutMapping、@DeleteMapping等注解,首先得讲到@RequestMaping:@RequestMaping主要是将HTTP请求映......
  • HTTP和HTTPS区别
    HTTP(HyperTextTransferProtocol)和HTTPS(HTTPSecure)都是用于在计算机之间传输数据的协议.但是,HTTPS在传输数据时使用了安全套接层(SSL)或者传输层安全(TLS)协议来加密数据,以防止第三方拦截或窃取数据。主要区别如下:1.安全性:HTTPS在传输过程中使用了加密技术,而HTTP......
  • 左值、右值及其引用的区别
    左值、右值及其引用的区别概念左值左值既可以出现在等号左边,也能出现在等号右边左值可以修改左值是可寻址的变量,具有持久性纯右值右值只能出现在等号右边右值不可修改右值一般是不可寻址的常量,具有临时性将亡值C++11新增的与右值引用相关的表达式......