最近在开发中遇到一个Protostuff序列化问题,在这记录一下问题的根源;分析一下Protostuff序列化和反序列化原理;以及怎么样避免改bug。 1....问题描述 有一个push业务用到了mq,mq的生产者和消费者实体序列化我们用的是Protostuff方式实现的。...mq只是一个队列,保存的是字节码,一个对象需要序列化成字节码保存到mq,从mq获取对象需要把字节码反序列化成对象。那么问题根源找到了,是序列化和反序列化时出了问题。 3. ...Protostuff序列化过程 该问题是Protostuff序列化引起的,那么解决这个问题还得弄懂Protostuff序列化和反序列化原理。...为了避免以上问题,在使用protostuff序列化时,对已有的实体中添加字段放到最后去就可以了。 <!
生日悖论是由这样一个问题引出的:一个屋子里需要有多少人,才能使得存在至少两个人生日是同一天的概率达到 50%? 给你 5 秒钟随便猜一个数字,再点击下方空白处查看答案!...如你对这种反直觉的问题还感兴趣的话,可以看看小吴之前的那篇文章:神奇的三门问题。
这不,最近我们就有一个项目将 fastjson 替换为了 gson,引发了一个线上的问题。分享下这次的经历,以免大家踩到同样的坑,在此警示大家,规范千万条,安全第一条,升级不规范,线上两行泪。...问题描述 线上一个非常简单的逻辑,将对象序列化成 fastjson,再使用 HTTP 请求将字符串发送出去。...问题分析 为什么同样是 JSON 序列化,fastjson 没出过问题,而换成 gson 之后立马就暴露了呢?...通过分析内存 dump 的数据,发现很多字段的值都是重复的,再结合我们业务数据的特点,一下子定位到了问题 -- gson 序列化重复对象存在严重的缺陷。 直接用一个简单的例子,来说明当时的问题。...笔者对各个序列化框架的研究也不深,可能你会说 jackson 更加优秀,我只能说能解决你的场景遇到的问题,那就是合适的框架。
问题描述 线上一个非常简单的逻辑,将对象序列化成 fastjson,再使用 HTTP 请求将字符串发送出去。原本工作的好好的,在将 fastjson 替换为 gson 之后,竟然引发了线上的 OOM。...问题分析 为什么同样是 JSON 序列化,fastjson 没出过问题,而换成 gson 之后立马就暴露了呢?...通过分析内存 dump 的数据,发现很多字段的值都是重复的,再结合我们业务数据的特点,一下子定位到了问题 -- gson 序列化重复对象存在严重的缺陷。 直接用一个简单的例子,来说明当时的问题。...笔者对各个序列化框架的研究也不深,可能你会说 jackson 更加优秀,我只能说能解决你的场景遇到的问题,那就是合适的框架。...最后,想要替换序列化框架时一定要慎重,了解清楚替代框架的特性,可能原先框架解决的问题,新的框架不一定能很好的 cover。 往期推荐 靠,上班打游戏!
文章目录 一、导入依赖库 二、构造 JavaBean 三、fastjson 序列化与反序列化 四、gson 序列化与反序列化 五、完整代码 1、主界面代码 2、JSON 测试代码 3、执行结果 六、参考资料...对象 , 本博客中将其序列化 , 保存到本地文件中 ; 导入 fastjson 与 gson 依赖库 , 即可使用两个 json 序列化与反序列化 API ; implementation '...29 ms 四、gson 序列化与反序列化 ---- 使用 gson 进行序列化与反序列化 : // 初始化 kim.hsl.protobuf.AddressBook 对象...:02.597 16698-16698/kim.hsl.protobuf I/MainActivity: gson 序列化耗时 29 ms , 序列化大小 169 字节 2021-04-27 22:51...} ms") // 测试 gson var gsonStart = System.currentTimeMillis() // gson 序列化
序列化 ID 有什么用? 如果不指定 serialVersionUID ,当你添加或者修改类中的任何字段时,已序列化类将无法恢复。...因为新类和旧序列化对象生成的serialVersionUID 不同,序列化的过程将依赖正确的序列化对象恢复状态的。否则会报错 java.io.InvalidClassException 。...Java 序列化的过程是依赖于正确的序列化对象恢复状态的,并在序列化对象序列版本不匹配的情况下引发 * java.io.InvalidClassException 无效类异常。...之所以打印 10 * 的原因在于序列化时,并不保存静态变量,这其实比较容易理解,序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量。...,并不保存(静态变量)类状态 父类序列化和 Transient 关键字 Transient 关键字的作用是控制变量的序列化,在关键字前加上该关键字,可以阻止变量被序列化到文件中,反序列化之后,trasnient
带着这些问题,我们去看看序列化的世界。 Serializable 先说说Java中自带的序列化方式——Serializable。...思考问题 介绍完了两种序列化方式,我们再来看看文章开头的这些问题。 在java有Serializable的前提下,Android为什么设计出了Parcelable?...我觉得是历史遗留问题。 有的人可能会想到各种理由,比如可以标记哪些类可以被序列化。又或者可以通过UID来标示反序列化为同一个对象。等等。...但是我觉得最大的问题还是历史遗留问题,在以前,json还没有成为大家认同的数据结构,所以Java就设计出了Serializable的序列化方式来解决对象持久化和对象传输的问题。...Use a binding library * like gson/">GSON to read and *
序列化出来的结果很难看: Gson gson = new Gson(); BeanSample bean = new BeanSample(Calendar.getInstance...Override public Calendar read(JsonReader in) throws IOException { //这是从json字符串反序列化的...null; } } }).create(); BeanSample bean = new BeanSample(new GregorianCalendar()); //序列化...String json = gson.toJson(bean); System.out.println(json); //反序列化 System.out.println(gson.fromJson(...2022-04-20 22:27:08.864 -------- {"birthday":1650464828881} 2022-04-20 22:27:08.881 这样看起来好多了,而且json反序列化时
在.net里,DataRow类型的对象是不支持序列化的,那么如果在一个需要序列化的对象中含有DataRow类型的字段该怎么办呢?呵呵,幸好Datatable是支持序列化的。...因此,我们可以自定义序列化的行为,并在序列化和反序列化的时候用Datatable来对DataRow进行包装和解包。 为了自定义序列化行为,必须实现ISerializable接口。...XML:NAMESPACE PREFIX = MSHelp NS = "http://msdn.microsoft.com/mshelp" />GetObjectData 方法以及在反序列化对象时使用的特殊构造函数...前者的作用是把该对象要封装的数据加入到系统提供的一个容器中,然后系统会对这些数据进行序列化;后者的作用是把反序列化的数据从容器中取出来,然后显式的赋值给该对象的某一个字段。...在此处添加构造函数逻辑 // } protected Field(SerializationInfo info, StreamingContext context)//特殊的构造函数,反序列化时自动调用
import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; /** *Gson序列化对象排除属性...*调用方法: *String[] keys = { "id" }; *Gson gson = new GsonBuilder().setExclusionStrategies(new JsonKit
Gson异常强大因此使用它代替了Jackson作为SpringMVC消息转换器。 在自己的项目中,发现对象在序列化后,日期格式出现了问题。...先看问题 在员工表中有一列是生日,字段类型为Date,也就是只存储到年月日,不带小时分秒,见下图数据库中的数据 ?...问题出现在哪? 问题就出现在了 spring 的 message-converters 上,在我的项目中,配置的类型转换器为 google的 gson。...所以当请求返回给浏览器的时候,spring会利用Gson将对象序列化输出到前端,按照配置的规则,就会带有小时分秒了。具体见下面的代码: <!...具体如下: write是序列化、read是反序列化 package com.wt.common.core.adapter; import com.google.gson.JsonSyntaxException
配置项 Gson 类是整个库的核心 API,在进行任何序列化或反序列化之前,我们都需要获得一个 Gson 对象。...因此,在项目中有必要在 common 层提供一个全局的 Gson 对象,既有利于统一序列化配置,也是 Gson 性能优化的基本保障。...这样在递归获取字段的 TypeAdapter 时,就会拿到代理对象,而不是重新创建 TypeAdapter,因此解决递归问题; 2、另外,考虑到多线程环境下,临时映射表的新增和移除会有并发问题,因此 Gson...在 Gson 的反序列化中,首次反序列化一个类型的对象时,Gson 需要使用大量反射调用解析一个 TypeAdapter 适配器对象。随着 Model 的复杂程度增加,首次解析的耗时会不断膨胀。...这个问题在抖音的技术博客中提到一个解决方案,这个问题我们在下篇文章讨论,请关注。
序列化 ID 的问题 静态变量序列化 父类的序列化与 Transient 关键字 对敏感字段加密 序列化存储规则 列表的每一部分讲述了一个单独的情境,读者可以分别查看。...回页首 序列化 ID 问题 情境:两个客户端 A 和 B 试图通过网络传递对象数据,A 端将对象 C 序列化为二进制数据再传给 B,B 反序列化得到 C。...问题:C 对象的全类路径假设为 com.inout.Test,在 A 和 B 端都有这么一个类文件,功能代码完全一致。也都实现了 Serializable 接口,但是反序列化时总是提示不成功。...特性使用案例 RMI 技术是完全基于 Java 序列化技术的,服务器端接口调用所需要的参数对象来至于客户端,它们通过网络相互传输。这就涉及 RMI 的安全传输的问题。...回页首 序列化存储规则 情境:问题代码如清单 4 所示。 清单 4.
它作为一套专门为 Kotlin 的类开发的序列化框架,自然要兼顾到 Kotlin 的类型的各种特性,你会发现用 Gson 来序列化 Kotlin 类时遇到的奇怪的问题在这里都没了。...com.google.code.gson:gson:$version 那么的问题是啥?问题就是,它不是为 Kotlin 专门定制的。...不同的是,我们这回用 Gson 去反序列化同样的字符串,结果呢? ? 为什么会这样?...因为 Gson 在反序列化的时候,构造对象实例时没有默认无参构造方法,同时又没有设置 TypeAdapter 的话,它就不知道该怎么实例化这个对象,于是用到了一个千年黑魔法 Unsafe 。...小结 序列化 Kotlin 数据类型的时候,以后可以考虑使用 kotlinx.serialization 这个框架了,它不仅 API 简单,还解决了我们经常遇到用别的 Java 框架带来的问题。
Adapter.read(ReflectiveTypeAdapterFactory.java:172) 08-11 01:11:01.126: W/System.err(1230): at com.google.gson.Gson.fromJson...(Gson.java:803) 08-11 01:11:01.126: W/System.err(1230): at com.google.gson.Gson.fromJson(Gson.java:768...) 08-11 01:11:01.136: W/System.err(1230): at com.google.gson.Gson.fromJson(Gson.java:717) 08-11 01:11...paused 53ms, total 53ms 08-11 01:11:01.266: W/System.err(1230): ... 19 more 错误三:当你服务器端传回的json确定没有问题的时候...,但是反序列化的时候老是报错 [android]com.google.gson.JsonSyntaxException: java.lang.IllegalStateException // NewsBean
创建Gson对象 Gson gson = new Gson(); // 2....} } 3.3 Jackson解析 解析原理:基于事件驱动 解析过程: 类似 GSON,先创建1个对应于JSON数据的JavaBean类,再通过简单操作即可解析 与 Gson解析不同的是:GSON...Carson带你学序列化:全面详解ProtocolBuffer语法 Carson带你学序列化:Google出品的序列化神器Protocol Buffer使用指南 Carson带你学序列化:Protocol...Buffer序列化原理大揭秘-为什么性能这么好?...Carson带你学序列化:深入源码分析Protocol Buffer Carson带你学序列化:深入分析JSON多种解析方式(Gson、AS自带org.json、Jackson) Carson带你学序列化
今天发现返回给前端的Date和数据库中查到的时间对不上 排查发现是Jackson指定时区问题,原先用的GMT+8,但数据库是Asia/Shanghai ObjectMapper shanghaiObjectMapper
使用 Gson 序列化和反序列化 org.bukkit.ItemStack 写这玩意的原因 昨天肝了一整天 这个插件,为了方便起见我希望使用 Json 来存储 ItemStack 信息,结果没想到为了序列化这个...Map 里,那么我们只需要将这个 Map 通过 Gson 序列化为 Json,就解决问题啦!...配置 Gson 并自定义 Gson 序列化器 默认情况下,Gson 并不会调用 ItemStack 的序列化和反序列化方法,如果不调用这些方法而强行序列化,就会引发奇怪的报错。...因此我们需要自定义 Gson 序列化器。...或是 gson.toJson 将 ItemStack 正确的序列化或是反序列化啦!
在 Java 中两者实现方式不同,使用哪一种数据类型取决于你的实际需求,但是在序列化这个问题上,Gson 并不关心这两种数据结构的具体实现。...默认的 Lenient 通常我们将 Java 对象序列化成 JSON 格式的数据时,并不会有什么太大的问题,此时的 JSON 将是一个标准的格式,重点是反序列化可能会有问题。...通过结果可以看到枚举的(反)序列化使用,并配合 @SerializedName 来简化使用。...简化自定义序列化为单个对象 通过 @Expose 是能解决一部分问题,但是存在局限性,现在我们使用自定义来解决这些问题,作法不干涉 Merchant 类,只在干涉序列化过程。...Advanced — 通过 @JsonAdapter 自定义(反)序列化 之前我们介绍了如何使用 Gson 来自定义(反)序列化和自定义实例创建。
Github官网简介:github.com/google/gson 想我Gson当年舌战群儒 张昭: 昭乃江东微末之士,久闻先生高卧隆中,自比管、乐。...Gson: 吾观取汉上之地,易如反掌。我主刘豫州躬行仁义,不忍夺同宗之基业,故力辞之。刘琮孺子,听信佞言,暗自投降,致使曹操得以猖獗。...何先生自归豫州,曹兵一出,弃甲抛戈,望风而窜;上不能报刘表以安庶民,下不能辅孤子而据疆土;乃弃新野,走樊城,败当阳,奔夏口,无容身之地:是豫州既得先生之后,反不如其初也。管仲、乐毅,果如是乎?...android虚拟机:反射的方式 gson:反射+反射缓存、支持部分stream、内存性能较差(gc问题) ASM ASM是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。...,用于解决jdk8中localDateTime等的序列化问题 om.registerModule(new JavaTimeModule()); } /**