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

news2025/1/15 20:49:50

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

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

在这里插入图片描述

  • 然后看当前目录这边可以看到上面有个Serializer包,是序列化器的,点进去看,这些好的东西分类存的是十分规范的,所以很好找
    在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
自定义的示范代码如下,他定义了个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选中右键点翻译
在这里插入图片描述
他的示范代码如下,他示范了下反序列化一个他自定义的枚举,很简单

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测试一下,发现确实可行,完工

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/74481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

掘金量化如何精准选股?

说起掘金量化如何精准选股的这个问题,相信大家也很期待,就比如说我们在量化投资中,一方面对股票的涨跌是需要灵活的去判断,才能知晓这其中有哪些是我们应该选择的股票,但是要自己去观察,也是很麻烦&#xf…

【Python项目】毕业设计必备,Python基于面向对象+tkinter打造学生信息管理系统 | 附源码

前言 halo,包子们上午好 很多学计算机的小伙伴应该都知道,毕业设计是一个头疼的东西 今天的话小编这边给大家准备好了一个Python基于面向对象tkinter打造学生信息管理系统 这不是毕业设计必备项目 说实话操作起来还是有那么一点点的难度的,但…

Spring Boot源码学习:自动配置与自定义注解详解

入门 RestContrller :此注解标记的类下的 所有 方法均会返回一个 domain 对象以代替视图Controller、ResponseBody 的缩写使用 Jackson2 以及 MappingJackson2HttpMessageConverter 类自动转换对象为 JSONSpringBootApplication:快捷注释,包含以下内容C…

“新十条”来了,精准防控是为了“行稳致远”

文|螳螂观察 作者|松雅湖、小江 形势正在快速变化,朝越来越好的方向。 12月7日,国务院联防联控机制发布防疫“新十条”措施,指向精准,要求明确,既要疫情防控精准化、科学化,也要防疫成果“行稳致远”&am…

sentence Bert解读及代码示例

0-前序 Bert已经是相当6了,但在STS(语义文本相似性)任务中,需要将两个句子都输入到网络中,也就是说要过模型,这样计算量就大了。如下是文本相似性,并不是语义。 from transformers import Ber…

RabbitMQ、RocketMQ、Kafka 三大组件详细教程,一文带你学完全部知识

RabbitMQ RabbitMQ各组件的功能 Broker :一个RabbitMQ实例就是一个BrokerVirtual Host :虚拟主机。相当于MySQL的DataBase,一个Broker上可以存在多个vhost,vhost之间相互隔离。每个vhost都拥有自己的队列、交换机、绑定和权限机…

项目执行管理的8个步骤

常言道:说起来容易,做起来难。在项目执行过程中,许多事情可能会出错。这就是为什么执行过程中的监控和跟踪很重要。 项目执行,如同项目管理一样,被分解成若干步骤,以确保你不会忽视任何关键的东西。八个项…

如何查看Chrome浏览器的页面缓存内容【详细教程】

如何查看浏览器页面缓存内容——代码&控制台知识调用前言引入控制台输入代码查看在控制台application查看知识调用 文章可能需要用到的知识🔥🔥🔥浏览器缓存有哪些(通用缓存有哪些) 前言引入 浏览器有多种缓存&a…

C++/Qt编程规范

文章目录一、头文件规范二、变量命名三、信号和槽四、注释一、头文件规范 在编码中对头文件的引用,建议按照以下顺序进行: 1)类定义头文件 2)其他库头文件 a)Qt模块头文件 b)XTAL平台框架模块头文件 c)第三方库头文件 d)自定义公共库头文件 二、变量命…

Linux7层负载均衡-Haproxy

Linux7层负载均衡 概述: 是一款高性能的负载均衡软件。 因为其专注于负载均衡这一些事情, 因此与nginx比起来在负载均衡这件事情上做更好,更专业。 特点: •支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能…

【KNN分类】基于模拟退火优化KNN、蝗虫算法优化KNN实现数据分类附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

web课程设计网页制作:基于html实现传统文化壁画手工艺带psd设计图(15页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

【Day3】每日学Java--》详解java中的static成员

大家好,我是良辰丫,今天我和大家分享的是java中的static成员,static说难不难,说简单也不简单,主要是细节,很多情况下,你使用了static,却不知道为什么会报错,嘿嘿嘿&#…

【推免攻略】五.2022年北交计算机学院夏令营、预推免保研经验

欢迎订阅本专栏:《北交计算机保研经验》 订阅地址:https://blog.csdn.net/m0_38068876/category_10779337.html 【推免攻略】一.北交计算机学院夏令营、预推免攻略【推免攻略】二.联系导师的前期准备及注意事项【推免攻略】三.2020年北交计算机学院夏令营、预推免保研经验【推…

Java之网络编程

目录 1.1 概述 1.2 网络通信的要素 1.3 IP 1.4 端口 1.5 通信协议 1.6 TCP (1)消息发送 (2)文件上传 1.7 UDP (1)发短信 (2)聊天(循环发送-循环接收)…

ftp共享盘挂载——curlftpfs挂载FTP服务器

通过curlftpfs来将远程ftp某个目录映射到本地目录,可以达到多台机器共享同一目录的效果。我们是用它来共享脚本的。curlftpfs是通过yum本地源安装的,需要epel支持,需要提前弄好。 一、 安装FTP服务 在联网环境下安装epel yum -y install epel…

唯亚威FI-60光纤识别器

光纤识别器可以轻松地识别光信号,而无需断开光缆或中断网络交通。也可以转换为光功率计(OPM)。VIAVI FI-60 LFI能够使用户轻松检测光信号,而无需断开光缆或中断网络交通。FI-60 LFI还包括了独特的VIAVI SafeChekTM ,以…

精华推荐 |【深入浅出Spring原理及实战】「原理分析专题」从源码和架构设计角度深入剖析BeanPostProcessor的原理和运作机制

🍃 前提概要 Spring具有很好的扩展性,但是这个扩展它的这个扩展性体现在哪里呢?而我们要说的BeanPostProcessor就是对Spring扩展性优秀的表现之一。 🍃 BeanPostProcessor的作用 简单的说就是BeanPostProcessor提供了初始化前后回…

Qt扫盲-QString使用总结

QString使用总结一、概述二、初始化字符串1、极速版2、原理版三、操作字符串1、极速版1. 增加2. 删除3. 修改4. 插入5. 转换2、原理版四、查询字符串五、字符串格式转换六、Null 字符串和 Empty 字符串的区别七、字符串参数格式化八、更高效的字符串构造九、最大大小和出现内存…