首页 > 编程语言 >java alibaba fastjson自定义序列化反序列化(教你解决问题思路)

java alibaba fastjson自定义序列化反序列化(教你解决问题思路)

时间:2023-12-25 12:37:25浏览次数:42  
标签:fastjson 自定义 int class ResultCode 序列化 public


大家版本不一样方式可能不一样,我不管你的fastjson版本是哪个,按照我这个思路去弄就行

  • 写一个JSONObject类,导入fastjson的JSONObject,然后CTRL+鼠标左键点进去看JSONObject源码,然后点击IDEA的左上角select opened file来定位到当前打开的文件。

java alibaba fastjson自定义序列化反序列化(教你解决问题思路)_开发语言

  • 然后看当前目录这边可以看到上面有个Serializer包,是序列化器的,点进去看,这些好的东西分类存的是十分规范的,所以很好找
  • java alibaba fastjson自定义序列化反序列化(教你解决问题思路)_序列化_02

  • 往下翻阅,可以看到有ObjectSerializer或者ObjectWritter的东西,点进去看源代码上的注释

java alibaba fastjson自定义序列化反序列化(教你解决问题思路)_开发语言_03


java alibaba fastjson自定义序列化反序列化(教你解决问题思路)_自定义_04

如果你英语不太好看不懂,就搞个插件翻译下,或者复制去百度翻译翻译下看他写的注释,我们从注释可以看到,你不满意默认序列化是可以自己编写自定义序列化的,并需要注册,下面代码给出了自定义代码和注册代码示范

java alibaba fastjson自定义序列化反序列化(教你解决问题思路)_反序列化_05


自定义的示范代码如下,他定义了个ResultCode类,然后定义了他的序列化器类ResultCodeSerilaizer,实现了对象序列化接口ObjectSerializer ,然后自定义逻辑对这个对象进行序列化,他是直接写入ResultCode的int类型的value

public static class Result {
 *     public ResultCode code;
 * }
 * 
 * public static enum ResultCode {
 *     LOGIN_FAILURE(8), INVALID_ARGUMENT(0), SIGN_ERROR(17);
 *     public final int value;
 *     ResultCode(int value){
 *         this.value = value;
 *     }
 * }
 * 
 * public static class ResultCodeSerilaizer implements ObjectSerializer {
 *     public void write(JSONSerializer serializer, 
 *                       Object object, 
 *                       Object fieldName, 
 *                       Type fieldType,
 *                       int features) throws IOException {
 *         serializer.write(((ResultCode) object).value);
 *     }
 * }

后面的代码就是注册的,静态方法获得全局实例,然后对该类设置上序列化器,到此,序列化完事

SerializeConfig.getGlobalInstance().put(ResultCode.class, new ResultCodeSerilaizer());

如果需要自定义反序列化,也是同样的方式,非常简单,找到parser(解析器)下的deserializer(反序列化)包,下面有个ObjectDeserializer,同样去看注释上的说明和示范代码,你看不懂就直接上翻译插件translation选中右键点翻译

java alibaba fastjson自定义序列化反序列化(教你解决问题思路)_自定义_06


他的示范代码如下,他示范了下反序列化一个他自定义的枚举,很简单

public static enum OrderActionEnum {
     FAIL(1), SUCC(0);
  
     private int code;
  
    OrderActionEnum(int code){
         this.code = code;
     }
  }

  public static class OrderActionEnumDeser implements ObjectDeserializer {
 *     
 *     public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
 *         Integer intValue = parser.parseObject(int.class);
 *         if (intValue == 1) {
 *             return (T) OrderActionEnum.FAIL;
 *         } else if (intValue == 0) {
 *             return (T) OrderActionEnum.SUCC;
 *         }
 *         throw new IllegalStateException();
 *     }
 * 
 *     
 *     public int getFastMatchToken() {
 *         return JSONToken.LITERAL_INT;
 *     }
 * }

另外下面还写了,你同样需要注册这个反序列化器,示范代码如下,是不是很简单呢,另外那个getFastMatchToken方法,你可以直接模仿示范里的return JSONToken.LITERAL_INT;然后点进去JSONToken看看有哪些返回值,你自己用的什么类型的标识的你的枚举啥的,你就用这里面的哪一个呗

ParserConfig.getGlobalInstance().putDeserializer(OrderActionEnum.class, new OrderActionEnumDeser());

然后你再写demo测试一下,发现确实可行,完工


标签:fastjson,自定义,int,class,ResultCode,序列化,public
From: https://blog.51cto.com/humorchen/8965538

相关文章

  • .net core中如何自定义静态文件目录、默认主页、和文件浏览目录?
    在.NETCore中,UseStaticFiles、UseDefaultFiles、UseDirectoryBrowser和UseFileServer中间件用于处理静态文件和目录浏览。下面我将为你提供一个简单的例子,演示它们的用法。首先,确保你的项目已经安装了Microsoft.AspNetCore.StaticFiles NuGet包,因为这是这些中间件的依赖。dotn......
  • .Net Core 实现 自定义Http的Range输出实现断点续传或者分段下载
    一、Http的Range请求头,结合相应头Accept-Ranges、Content-Range可以实现如下功能:1.断点续传。用于下载文件被中断后,继续下载。2.大文件指定区块下载,如视频、音频拖动播放,直接定位到指定位置下载内容。可以避免每次都读取、传输整个文件,从而提升服务端性能。3.大文件分包批量下......
  • C# .NET的BinaryFormatter、protobuf-net、Newtonsoft.Json以及自己写的序列化方法序
    https://www.cnblogs.com/s0611163/p/11872484.html测试结果整理后: 结论:1、这几个工具中,protobuf-net序列化和反序列化效率是最快的2、BinaryFormatter和Newtonsoft.Json反序列化慢的比较多3、Newtonsoft.Json序列化后的文件体积比较大4、Newtonsoft.Json在序列化反序列......
  • Android自定义View面试官最爱问的12个高级问题
    引言在Android开发领域,自定义View是一个考察开发者深度功底和创造力的重要方面。本文将从Android面试官的角度出发,深入探讨自定义View面试中常见的12个高级疑难问题,帮助大家更好地准备面试,展示专业技能。自定义View的基础知识问题:请解释自定义View的基本概念及其在Android开发中的......
  • (原创)安卓在fragment里使用自定义ListView
    原创声明:本文所有图片和代码皆由本人制作和编写。目录前言目标5步走第零:准备好你的ListItem布局第一:在布局文件添加ListView组件第二:创建适配器实现构造器(在这里提供数据)实现getView(在这里绑定布局)第三:把第一步的xml文件里的ListView和第二步的适配器联系起来第四:为每个小条目......
  • SpringSecurity:自定义身份认证异常处理器不生效
    由于我配置了全局异常处理器,再配置身份认证异常处理器后,发现异常直接被全局异常处理器捕获了@RestControllerAdvice("com.gsy.wy")@Slf4jpublicclassGlobalException{@ExceptionHandler(Exception.class)publicResulthandlerException(Exceptione){l......
  • 放弃FastJson!一篇就够,Jackson的功能原来如此之牛(万字干货)
    放弃FastJson!一篇就够,Jackson的功能原来如此之牛(万字干货)转载自:https://zhuanlan.zhihu.com/p/352485162在上篇《经过多方调研,最终还是决定禁用FastJson!》中,讲了FastJson的基本使用以及存在的不确定性问题,所以最终决定在项目中放弃使用,进而选择市面上比较主流,SpringBoot默......
  • Net 按照列名的自定义顺序导出Excel
    第一步定义导出Excel的表头一个特性,继承自Attribute,包含列头的名字和列的顺序publicclassExportHeaderAttribute:Attribute{publicExportHeaderAttribute(stringname):this(name,-1){}publicExportHeaderAttribute(stringname,shortorder){......
  • 自定义消息转换器对请求报文的统一解密处理
    1.自定义拦截器Interceptorpackagecom.example.springbootdemo.config;importlombok.extern.slf4j.Slf4j;importorg.springframework.web.servlet.HandlerInterceptor;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;......
  • java接口自动化测试实战003----fastjson处理传入参数为JSON格式数据
    一、fastjson概述1、概述   fastjson是阿里爸爸开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。2、常用API   fastjsonAPI入口类是com.alibaba.fastjson.JSON,常......