首页 > 其他分享 >Fastjson枚举序列化和反序列化的推荐实现

Fastjson枚举序列化和反序列化的推荐实现

时间:2024-10-30 10:09:14浏览次数:6  
标签:Fastjson enumClass int 枚举 itemEnum 序列化 public

一、背景

项目中定义了很多dto,包含枚举类型,而且这些枚举全都自定义标志码。比如7001 对应 某种操作。返回前台时,需要转化为对应的7001,前台传入后台时也希望7001转化为枚举。

二、研究思路

一开始,研究了fastjson的默认实现。发现只有不自定义类似7001这种默认值的时候,可以自动转化。
阅读了网上大量资料,笔者认为定义一个通用的序列化和发序列化器是最好的实现

三、实现

1.自定义的枚举状态码 全部定义 value字段 ,定一个通用的接口实现 getValue
image
2.自己的枚举实现这个接口
image
3.定义序列化器,需要带泛型,这样才通用

public class BaseEnumDeserializer<T extends Enum<T> & EnumWithValue> implements ObjectDeserializer {
    private final Class<T> enumClass;

    public BaseEnumDeserializer(Class<T> enumClass) {
        this.enumClass = enumClass;
    }

    @Override
    public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        // 解析为int
        int value = parser.parseObject(int.class);
        // 遍历所有的枚举实例
        for (T  itemEnum: enumClass.getEnumConstants()) {
            if (itemEnum.getValue() == value) {
                // 成功匹配,返回实例
                return (T) itemEnum;
            }
        }
        // 没有匹配到,可以抛出异常或者返回null
        return null;
    }

    @Override
    public int getFastMatchToken() {
        // 处理匹配int值
        return JSONToken.LITERAL_INT;
    }
}
public class BaseEnumSerializer<T extends Enum<T> & EnumWithValue> implements ObjectSerializer {
    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        // 强制把值转换为枚举
        T itemEnum = (T) object;
        // 序列化为自定义的code属性,输出就行
        serializer.write(itemEnum.getValue());
    }
}

4.在定义的dto里面的枚举字段上面加上解析器注解
image

四、后记

fastjson还是没有微软的newsoftjson好用,需要自己做大量的工作。这个实现算不错的。

标签:Fastjson,enumClass,int,枚举,itemEnum,序列化,public
From: https://www.cnblogs.com/lovefoolself/p/18515219

相关文章

  • DRF-Serializers序列化器组件源码分析及改编su
    1.源码分析注意:以下代码片段为方便理解已进行简化,只保留了与序列化功能相关的代码序列化的源码中涉及到了元类的概念,我在这里简单说明一下:元类(metaclass)是一个高级概念,用于定义类的创建行为。简单来说,元类是创建类的类,它决定了类的创建方式和行为。在Python中一切皆为对象,包......
  • DRF-Serializers序列化器组件源码分析及改编
    1.源码分析注意:以下代码片段为方便理解已进行简化,只保留了与序列化功能相关的代码序列化的源码中涉及到了元类的概念,我在这里简单说明一下:元类(metaclass)是一个高级概念,用于定义类的创建行为。简单来说,元类是创建类的类,它决定了类的创建方式和行为。在Python中一切皆为对象,包......
  • 【信奥赛·算法基础】CSP-J 枚举算法
    序言解决问题,并不是一开始就要找到最优解,而是在不断的调试中优化,将求解过程中耗时的部分、占用空间的部分尽可能的缩小,使得程序运行起来更高效一、定义与概念枚举算法,也叫穷举算法,是一种简单而直接的问题求解策略。它的核心思想是逐一列举问题的所有可能解,并逐一检验每个......
  • Java面试真题之中级进阶(线程,进程,序列化,IO流,NIO)
    前言本来想着给自己放松一下,刷刷博客,慕然回首,线程、程序、进程?Java序列化?Java中IO流?JavaIO与NIO的区别(补充)?似乎有点模糊了,那就大概看一下Java基础面试题吧。好记性不如烂键盘***12万字的java面试题整理***简述线程、程序、进程的基本概念。以及他们之间关系是什......
  • 鸿蒙编程江湖:ArkTS 的多线程与序列化支持
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。提升性能的高级技术在当今的软件开发领......
  • 【C语言】自定义类型(结构体、枚举、联合的详解)
    写在前面今天是10月24日来到了一年一度的程序......
  • 应用层协议 序列化
    应用层协议概述定义与作用应用层协议是计算机网络体系结构中最顶层的协议,它定义了运行在不同端系统上的应用程序进程如何传递报文1。这些协议不仅规定了报文的类型、语法和字段语义,还明确了进程发送报文的时间和方式1。通过标准化数据交换格式和流程,应用层协议实现了跨系......
  • 文本序列化ChoETL
    安装:Install-PackageChoETL网站:https://github.com/Cinchoo/ChoETL1、CSV文件操作//CSV文件Id,Name1,Tom2,Carl3,Mark//CSV读取foreach(dynamiceinnewChoCSVReader("Emp.csv").WithFirstLineHeader())Console.WriteLine("Id:"+e.Id+&quo......
  • AOT漫谈专题(第六篇): C# AOT 的泛型,序列化,反射问题
    一:背景1.讲故事在.NETAOT编程中,难免会在泛型,序列化,以及反射的问题上纠结和反复纠错尝试,这篇我们就来好好聊一聊相关的处理方案。二:常见问题解决1.泛型问题研究过泛型的朋友应该都知道,从开放类型上产下来的封闭类型往往会有单独的MethodTable,并共用EEClass,对于值类型......
  • JavaSE——IO流5:高级流(序列化与反序列化流/对象操作流)
    目录一、序列化流/对象操作输出流——ObjectOutputStream二、反序列化流/对象操作输入流——ObjecInputStream三、序列化流和反序列化流使用细节1.Serializable接口2.序列化后的文件不可修改3.serialVersionUID4.transient修饰的不能被序列化四、用对象流读写多个对象......