FastJson序列化隐藏特性

针对训练模型控制台的web后端维护,新增了一个int类型的maxTokenLimit字段,表示调用GPT模型请求允许的TokenSize上限值。后端添加好之后,数据库里面这个字段项没有填充数值,默认是空,所以理论上当maxTokenLimit字段为空的时候,应该传输的Json内容为maxTokenLimit: null ,但是前端那边F12查看,反馈接收到后端传参里面并没有这个字段。


FastJson里面有个序列化项的设置,为了节省存储和网络带宽的占用,默认当字段为空的时候,不对这个字段进行传输,导致前端看不到这个maxTokenLimit字段项。

1.修改数据库表增加对应maxTokenLimit字段

确定字段数据范围,类型为整形,目前已知的GPT模型请求tokenSize有些会到32k,也就是32*1024 = 2^15 = 32768,为后面出了更大的工程上的请求size留出余量,针对Mysql整形数据类型信息查找,我这里使用了MEDIUMINT类型。

图片

对应执行DDL类型的SQL语句,工单审批通过后进行表结构修改

ALTER TABLE model_config  
ADD COLUMN max_token_limit MEDIUMINT comment '最大token长度';

补充问题:我怎么知道我传进去的整形数值存储形式是有符号还是无符号的呢?

回答:其实在MySQL中,MEDIUMINT 数据类型默认是有符号的整数类型,如果你想存储无符号整数类型,你需要在定义列时明确指定 UNSIGNED 关键字。要确定存储在数据库中的 MEDIUMINT 类型是有符号还是无符号,你可以查看表的列定义。下面链接提供了三种方法作为参考:

Mysql查看字段数据类型[1]

我这里采用的是使用数据字典查询的方式:

SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE 
FROM information_schema.COLUMNS
WHERE TABLE_NAME = 'all_model_config' AND COLUMN_NAME = 'max_token_limit';

查出来的结果如下,发现它是有符号的

图片

2.后端工程补充字段CRUD能力

    @ApiOperation("查询配置")@RequestMapping(value = "/all", method = RequestMethod.GET)public ModelConfigListVO<ModelConfigVO> getModelConfig() {return modelConfigService.getAllModelConfig();}

Mybatis修改mapper映射

图片

1.本地debug断点调试,查看日志输出

一路debug显示过程中的maxTokenLimit字段,发现它一直是存在的,并且值为null

图片

并且中途偶然发现了一个奇怪的现象 我在调试的时候加入了一个系统的print函数显示结果和JSON.toString()结果进行对比 第一种输出 ----- 系统的print函数输出

System.out.println(allModelConfigList.toString());

第二种输出------JSON.toString()输出

System.out.println(JSON.toJSONString(allModelConfigList.getModelConfigVOList());

发现上面第一行代码打印出的内容包括maxTokenLimit: null 然而第二行代码打印出的内容不包括maxTokenLimit这个字段

那么问题可能就出在最后的后端JSON网络序列化传输上

2.查询相关JSON序列化配置

发现项目里面添加了配置,使用的是FastJson工具,而不是java默认的json序列化。然后查询FastJson的序列化配置文档,发现有个关于null输出的属性--WriteMapNullValue

图片

询问了GPT如何利用JSON.toJSONString输出空值对应的字段,它提示新增一个SerializerFeature.WriteMapNullValue 参数,让我修改全局配置或者局部配置。

System.out.println(JSON.toJSONString(allModelConfigList.getModelConfigVOList(), SerializerFeature.WriteMapNullValue));

改完执行后发现确实达到了预期的效果,并且这个配置是针对单次调用的局部配置。

其实工程上为了节约资源,利用FastJson默认的设置,不对值为null的字段进行传输,是比较合理的(你猜它为什么叫FastJson?) ,所以我就没有更改它的全局配置。所以最后就交给前端进行兼容性设计了,当我后端确实有这个maxTokenLimit字段,并且当前端发现传输的时候没收到这个maxTokenLimit字段的时候,前端那边就显示为空就行。

不止上面这一点,其实还需要注意利用FastJSON转换的对象需要是能够被识别为bean(具备getter和setter方法的),否则的话会出现转换成空值的可能。比如下面的例子,如果把@Data 注解去掉,然后可能就会输出[]空的列表,猜测内部是调用了对象的get/set方法的,类似于BeanUtils工具也是要依赖Bean的。

import lombok.Data;
@Data
public class Tools {String type;ChatFunctionDTO function;public Tools(String type, ChatFunctionDTO function) {this.type = type;this.function = function;}
}
List<Tools> list = new ArrayList<>();
list.add(new Tools());
System.out.println(JSON.toJSONString(list));

当后端某个字段值为null的时候,如果是利用FastJson工具,它默认的序列化设置是WriteMapNullValue属性为false,也就是为了节省存储和网络带宽的占用,不会对这个字段进行传输,最后导致前端看不到这个maxTokenLimit字段项,这个时候可以交给前端进行兼容性设计,发现传输的时候没收到这个对应字段的时候,前端那边就显示为空就行。

参考资料

[1]

https://deepinout.com/mysql/mysql-questions/249_mysql_how_to_determine_if_a_column_is_unsigned.html: https://link.juejin.cn/?target=https%3A%2F%2Fdeepinout.com%2Fmysql%2Fmysql-questions%2F249_mysql_how_to_determine_if_a_column_is_unsigned.html

原文地址:FastJson序列化隐藏特性 

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

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

相关文章

半加器___

1.原理 2.代码 2.1 half_adder.v module half_adder (input wire in_1 ,input wire in_2 ,output wire sum ,output wire count );assign {count,sum}in_1in_2;endmodule 2.2 tb_half_adder.v timescale 1ns/1nsmodule tb_half_adder();reg in_1; reg in_2;wire su…

ThreaTrace复现记录

1. 环境配置 服务器环境 需要10.2的cuda版本 conda环境 包的版本&#xff1a; python 3.6.13 pytorch 1.9.1 torch-cluster 1.5.9 torch-scatter 2.0.9 torch-sparse 0.6.12 torch-spline-conv 1.2.1 torch-geometric 1.4.3 环境bug 这里环境搭建好以后&#xff0c;就可以正…

MySql实战--深入浅出索引(下)

在开始这篇文章之前&#xff0c;我们先来看一下这个问题&#xff1a; 在下面这个表T中&#xff0c;如果我执行 select * from T where k between 3 and 5&#xff0c;需要执行几次树的搜索操作&#xff0c;会扫描多少行&#xff1f; 下面是这个表的初始化语句。 图1 InnoDB的索…

【IEEE】Multimodal Machine Learning: A Survey and Taxonomy

不废话&#xff0c;先上思维导图&#xff0c;哈哈哈&#xff01; 论文题目Machine Learning: A Survey and Taxonomy作者Tadas Baltrusaitis , Chaitanya Ahuja , and Louis-Philippe Morency状态已读完会议或者期刊名称IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE IN…

【创建进程】fork函数与写时拷贝

文章目录 fork函数fork如何返回两个值&#xff08;fork的工作原理&#xff09;如何解释父子进程相互输出printf 写时拷贝 fork函数 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1 fork函…

Linux - 应用层HTTPS、传输层TCP/IP模型中典型协议解析

目录 应用层&#xff1a;自定制协议实例 HTTP协议首行头部空行正文http服务器的搭建 HTTPS协议 传输层UDP协议TCP协议 应用层&#xff1a; 应用层负责应用程序之间的沟通—程序员自己定义数据的组织格式 应用层协议&#xff1a;如何将多个数据对象组织成为一个二进制数据串进行…

ES集群部署指引

文章目录 引言I 清除last_run_metadata_path数据。II 配置IP2.1 CentOS系统的IP参数2.2 shell脚本-静态网络配置III 公司工作电脑的IP多号段配置3.1 Mac电脑3.2 windows系统see alsomac Rootlees 内核保护措施引言 申请两台Linux机器,存储1年的航迹数据,需要4T的存储空间。 E…

【算法刷题 | 二叉树 03】3.22 二叉树的层序遍历02(5题:在每个树行中找最大值,填充每个节点的下一个右侧节点指针,二叉树的最大深度,最小深度)

文章目录 5.6 515_在每个树行中找最大值5.6.1问题5.6.2解法&#xff1a;层序遍历 5.7 116_填充每个节点的下一个右侧节点指针5.7.1问题5.7.2解法&#xff1a;层序遍历 5.8 116_填充每个节点的下一个右侧节点指针||5.8.1问题5.8.2解法&#xff1a;层序遍历 5.9 104_二叉树的最大…

Transformer的前世今生 day02(神经网络语言模型、词向量)

神经网络语言模型 使用神经网络的方法&#xff0c;去完成语言模型的两个问题&#xff0c;下图为两层感知机的神经网络语言模型&#xff1a; 假设词典V内有五个词&#xff1a;“判断”、“这个”、“词”、“的”、“词性”&#xff0c;且要输出P(w_next | “判断”、“这个”、…

揭秘最热门AI写作软件,看看有哪些值得推荐的AI写作神器

在快节奏的现代生活中&#xff0c;我们常常面临各种压力&#xff0c;例如工作、学习等。因此&#xff0c;一款能够提高写作效率的工具变得尤为重要。那么&#xff0c;有没有什么AI写作软件是比较好用的呢&#xff1f;下面小编给大家推荐几款热门的写作软件。 一.爱制作AI写作 …

什么是分布式

一个系统 各组件分别部署在不同服务器。彼此通过网络通信和协调的系统。 可以指多个不同组件分布在网络上互相协作&#xff0c;比如说电商网站也可以一个组件的多个副本组成集群&#xff0c;互相协作如同一个组件&#xff0c;比如数据存储服务中为了数据不丢失而采取的多个服务…

AI时代,Matter如何融入与服务中国智能家居市场,助力中国企业出海?

随着智能家居产业的飞速发展&#xff0c;丰富多样的智能家居产品为消费者带来了便利的同时&#xff0c;因为不同品牌、不同产品之间的协议与标准不统一&#xff0c;导致消费者体验产生割裂&#xff0c;本来想买个“智能”家居&#xff0c;结果买了个“智障”家居&#xff0c;这…

SQL日期函数

文章目录 1.获取日期时间函数1.1 获取当前日期时间1.2 获取当前日期1.3 获取当前时间 2.日期格式化★★★2.1 日期转指定格式字符串2.2 字符串转日期 3.日期间隔3.1 增加日期间隔 ★★★3.2 减去一个时间间隔★★★3.3 日期相差天数&#xff08;天&#xff09;3.4 相差时间&…

腾讯二面:如何保证接口幂等性?高并发下的接口幂等性如何实现?

什么是接口幂等性 接口幂等性这一概念源于数学&#xff0c;原意是指一个操作如果连续执行多次所产生的结果与仅执行一次的效果相同&#xff0c;那么我们就称这个操作是幂等的。在互联网领域&#xff0c;特别是在Web服务、API设计和分布式系统中&#xff0c;接口幂等性具有非常…

嵌入式软件面试-linux-中高级问题

Linux系统启动过程&#xff1a; BIOS自检并加载引导程序。引导程序&#xff08;如GRUB&#xff09;加载Linux内核到内存。内核初始化硬件&#xff0c;加载驱动&#xff0c;建立内存管理。加载init进程&#xff08;PID为1&#xff09;&#xff0c;通常是systemd或SysVinit。init…

安卓使用MQTT实现阿里云物联网云台订阅和发布主题(3)

一、订阅主题代码讲解 private final String mqtt_sub_topic "/sys/k0wih08FdYq/LHAPP/thing/service/property/set";//订阅话题//mqtt客户端订阅主题//QoS0时&#xff0c;报文最多发送一次&#xff0c;有可能丢失//QoS1时&#xff0c;报文至少发送一次&#xff0c…

23 OpenCV 直方图比较

文章目录 直方图比较的目的相关性计算 (CV_COMP_CORREL)卡方计算 (CV_COMP_CHISQR)十字计算(CV_COMP_INTERSECT)巴氏距离计算 (CV_COMP_BHATTACHARYYA )compareHist 直方图比较算子示例 直方图比较的目的 直方图比较的目的是衡量两幅图像之间的相似度或差异度。通过计算图像的颜…

linux下用docker部署es和kibana(带ik分词器)(二)

在上一篇文章中讲到&#xff0c;我们利用docker安装了es和kibana&#xff0c;下面我们讲解一下在安装es时把ik分词器这个插件集成进去&#xff0c;首先我们编写一个dockerfile文件&#xff0c;自定义一个es镜像&#xff0c;当然这个镜像肯定集成了ik分词器&#xff0c;具体步骤…

【LVGL-开关部件】

LVGL-开关部件 ■ LVGL-开关部件■ 开关部件&#xff1a;指示器打开的颜色■ 开关部件&#xff1a;不可修改■ 开关部件&#xff1a;获取开关状态■ 开关部件&#xff1a;示例一&#xff1a;制冷,制暖,开关 ■ LVGL-开关部件 ■ 开关部件&#xff1a;指示器打开的颜色 ■ 开关部…

探讨Java代码混淆加固工具

摘要 本篇博客将介绍几种常用的Java代码混淆工具&#xff0c;如ProGuard、Allatori Java Obfuscator、VirboxProtector、ipaguard和DashO。我们将深入探讨它们的特点、功能以及在保护Java应用程序安全方面的作用。此外&#xff0c;还将强调在使用Java代码混淆工具时需要注意的…