首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Gson无法反序列化,因为使用了可观察列表

Gson是Google开源的Java库,用于将Java对象转换为JSON格式,以及将JSON格式转换为Java对象。在序列化和反序列化过程中,Gson会通过反射来获取对象的属性信息。

针对这个问答内容,Gson无法反序列化,可能是因为使用了可观察列表(ObservableList)。可观察列表是JavaFX框架提供的一种动态数据集合,用于在数据发生变化时通知观察者。由于Gson是基于反射来获取属性信息的,而可观察列表内部实现机制较复杂,不符合Gson的默认序列化和反序列化规则,导致无法正确处理可观察列表。

解决这个问题的方法之一是自定义Gson的序列化和反序列化逻辑,以处理可观察列表的特殊性。可以创建一个自定义的TypeAdapter,实现Gson的JsonSerializer和JsonDeserializer接口,重写序列化和反序列化方法。在这些方法中,可以将可观察列表转换为普通的Java集合(如ArrayList)进行处理。具体实现代码如下:

代码语言:txt
复制
import com.google.gson.*;
import javafx.collections.ObservableList;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class ObservableListAdapter implements JsonSerializer<ObservableList<?>>, JsonDeserializer<ObservableList<?>> {

    @Override
    public JsonElement serialize(ObservableList<?> src, Type typeOfSrc, JsonSerializationContext context) {
        List<?> list = new ArrayList<>(src);
        return context.serialize(list);
    }

    @Override
    public ObservableList<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        List<?> list = context.deserialize(json, List.class);
        return FXCollections.observableArrayList(list);
    }
}

然后,将自定义的TypeAdapter注册到Gson中,如下所示:

代码语言:txt
复制
Gson gson = new GsonBuilder()
        .registerTypeAdapter(ObservableList.class, new ObservableListAdapter())
        .create();

通过以上代码,就可以正确地将包含可观察列表的对象进行序列化和反序列化了。

对于可观察列表的应用场景,它通常用于JavaFX等界面开发框架中,用于实现数据的动态绑定和自动更新。在这种情况下,建议使用腾讯云的云原生产品来支持可观察列表的开发和部署,如云原生容器服务 TKE、Serverless 云函数 SCF 等。

腾讯云云原生容器服务 TKE 是一种高度可扩展的容器化部署和管理解决方案,支持自动伸缩、负载均衡、网络配置等功能,可以方便地部署和管理JavaFX应用程序。

腾讯云Serverless 云函数 SCF 是一种事件驱动的无服务器计算服务,可以实现按需运行Java代码,无需关心服务器管理和部署。通过SCF,可以方便地部署和运行与可观察列表相关的后端逻辑。

更多关于腾讯云的产品信息,您可以访问腾讯云官方网站:https://cloud.tencent.com/,了解更多产品和服务详情。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Gson 系列文章

(founderArray.length); // 3 List 由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是...(userDate); 这个 ExclusionStrategy 包含两个重写的方法,上面的规则只使用了 shouldSkipClass 这个方法,看代码就很容易理解,凡事遇到 Date.class...,因为这个值是不能符合 JSON 标准的。...自定义序列化 有个这样的场景:App 从 服务器获取一个列表,用户可以订阅列表中的每一项,但是要将订阅的某一条发送给服务器同步。...Advanced — 通过 @JsonAdapter 自定义()序列化 之前我们介绍了如何使用 Gson 来自定义()序列化和自定义实例创建。

15.4K10

JSON 反序列化 Long 变 Integer 或 Double 问题

---- 我们观察序列化后的 json 字符串: {"aInteger":1,"aLong":2} 会发现其实 JSON 中并没有包含类型信息,而反序列化的类型为 Map.class 或者 Map...类型,当你只知道这些信息时,你无法得知 aLong 原始类型为 Long 。...三、如何解决 3.1 慎对 Map 序列化 如工作中在发送MQ 消息时很多人图方便,不想定义POJO 对象,因为这样通常需要打包比较麻烦,就将要传输给其他系统的数据定义为 Map 类型,下游再根据 key...我个人不太建议这么做,因为这样不够通用,跨系统使用不太方便。 四、总结 希望大家能够【坚持做正确的事情】,而不是以是否【麻烦】作为是否采用某种策略的标准。...我们不仅要实现功能,还要充分考虑设计的拓展性、可维护性等。

3.3K30

高效 Java 人必须知道的十大框架

JUnit 之所以能够成为 Java 圈中最热门的测试库,正是因为它既简洁又高效。 02....Google Guava 软件包中的库或多或少是对核心库的对应部分有增强功能,并使编程更加高效和有效。...说到 XStream 的功能 - 大多数对象可以被序列化,并提供特定的映射,提供高性能和低内存占用,适用于具有较高吞吐量的大型对象图和系统,信息不重复,自定义的转换策略,安全的框架,异常情况下的详细诊断等等...它允许或解析来自任何 URL 或文件的 HTML,例如,你可以获取 http://noeticforce.com 的主页信息,解析它,并将所有 H2 标题提取到元素列表中。...显然,如果您无法访问源代码,则无法执行此操作,此外,大多数开源项目都不支持 Java 泛型。 Gson考虑到这些问题。

89520

gson 替换 fastjson 引发的线上问题分析

前言 Json 序列化框架存在的安全漏洞一直以来都是程序员们挂在嘴边调侃的一个话题,尤其是这两年 fastjson 由于被针对性研究,更是频频地的报出漏洞,出个漏洞不要紧,安全团队总是用邮件催着线上应用要进行依赖升级... = JSON.toJSONString(bar); System.out.println(fastjsonStr); 观察打印结果: gson: {"foos":[{"a":"aaaaa"},{"a"...主要观察各个序列化方式压缩后的字节大小,因为这关系到网络传输时的大小;次要观察反序列后 List 中还是不是同一个对象 public class Main {     public static void...整体测试结论 fastjson 序列化过后带有 $ 的引用标记也能够被 gson 正确的反序列化,但笔者并没有找到让 gson 序列化时转换成引用的配置 fastjson、hessian、java 均支持循环引用的解析...;gson 不支持 fastjson 可以设置 DisableCircularReferenceDetect,关闭循环引用和重复引用的检测 gson序列化之前的同一个引用的对象,在经历了序列化再反序列化回来之后

79920

gson 替换 fastjson 引发的线上问题分析

前言 Json 序列化框架存在的安全漏洞一直以来都是程序员们挂在嘴边调侃的一个话题,尤其是这两年 fastjson 由于被针对性研究,更是频频地的报出漏洞,出个漏洞不要紧,安全团队总是用邮件催着线上应用要进行依赖升级...= JSON.toJSONString(bar); System.out.println(fastjsonStr); 观察打印结果: gson: {"foos":[{"a":"aaaaa"},{"a...主要观察各个序列化方式压缩后的字节大小,因为这关系到网络传输时的大小;次要观察反序列后 List 中还是不是同一个对象 public class Main { public static void...整体测试结论 fastjson 序列化过后带有 $ 的引用标记也能够被 gson 正确的反序列化,但笔者并没有找到让 gson 序列化时转换成引用的配置 fastjson、hessian、java 均支持循环引用的解析...;gson 不支持 fastjson 可以设置 DisableCircularReferenceDetect,关闭循环引用和重复引用的检测 gson序列化之前的同一个引用的对象,在经历了序列化再反序列化回来之后

1.7K20

穿越到东汉末年的Jackson

Gson: 吾观取汉上之地,易如掌。我主刘豫州躬行仁义,不忍夺同宗之基业,故力辞之。刘琮孺子,听信佞言,暗自投降,致使曹操得以猖獗。...何先生自归豫州,曹兵一出,弃甲抛戈,望风而窜;上不能报刘表以安庶民,下不能辅孤子而据疆土;乃弃新野,走樊城,败当阳,奔夏口,无容身之地:是豫州既得先生之后,不如其初也。管仲、乐毅,果如是乎?...夫以甲兵不完,城郭不固,军不经练,粮不继日,然而博望烧屯,白河用水,使夏侯惇,曹仁辈心惊胆裂:窃谓管仲、乐毅之用兵,未必过此。至于刘琮降操,豫州实出不知;且又不忍乘乱夺同宗之基业,此真大仁大义也。...非比夸辩之徒,虚誉欺人:坐议立谈,无人及;临机应变,百无一能。——诚为天下笑耳!...例如,ExtendableBean实体具有name属性和一组键/值对形式的扩展属性: image.png 当我们序列化这个实体的一个实例时,我们将Map中的所有键值作为标准的、普通的属性: image.png

2K20

Kubernetes官方java客户端之二:序列化和反序列化问题

,使用了Gson注解,因此上述Bean实例在SpringBoot中涉及到JSON处理时,可能会有问题(这时只能说可能),例如RestController返回对象,会被Jackson转为JSON; 复现问题...篇幅原因就不在此展开了,简单提一下,在java客户端的BeanPropertyWriter类中,选择方法的逻辑如下图,红框中展示了判定逻辑,此处getStrValue方法命中了该逻辑,如果您尝试用在红框处打上断点观察...getIntValue方法即可; Bean中使用了Gson注释,就是打算用Gson来处理序列化和反序列化操作的,因此序列化和反序列化的地方都改用Gson处理; 上述两个思路,我选择了第二种,毕竟第一种太难了...… 解决问题 问题解决起来并不难,先看SpringBoot-2.3.1.RELEASE官方文档: 结合官方文档,我们要做两件事情: 首先,classpath中有Gson,这个已经有了,因为...实例返回,您可以选择先用Gson序列化成JSON字符串,再返回字符串给前端,也可以自己定义VO对象,将V1PodList实例转成VO对象再返回; 至此,使用K8S官方java客户端之前要注意的问题已经弄明白了

1.1K30

面试长知识了!Java 关键字 transient 竟然还能这么用

前言 最近在看 HashMap 源代码的时候,发现链表 table 数组采用了transient 关键字,笔者当时感觉对 transient 关键字即陌生但又有似曾相识,所以花了一些时间简要的总结了下使用...transient 关键字的定义 说起 transient 关键字,不得不提对象的 序列化 的,因为我们常常需要在网络上以对象(数据)的二进制方式传输数据,这里涉及到发送方序列化对象,接收方反序列化对象的过程...一般地,当我们使用缓存 cache(内存空间不够有可能会本地存储到硬盘)或远程调用 rpc(网络传输)的时候,经常需要让实体类实现 Serializable 接口,目的就是为了让其序列化。...例如有一个对象有三个字段 field1、field2、field3,发送方不想让字段 field3 被序列化因为这里面可能涉及到一些敏感信息不想被接收方知道,那有没有办法解决这个问题呢?...约定二、被 transient 关键字修饰过的属性不能被序列化,也就是说被 transient 修饰过的属性,在对对象序列化后,是无法访问到该属性的。

1.7K41

Kubernetes官方java客户端之二:序列化和反序列化问题

,使用了Gson注解,因此上述Bean实例在SpringBoot中涉及到JSON处理时,可能会有问题(这时只能说可能),例如RestController返回对象,会被Jackson转为JSON; 复现问题...篇幅原因就不在此展开了,简单提一下,在java客户端的BeanPropertyWriter类中,选择方法的逻辑如下图,红框中展示了判定逻辑,此处getStrValue方法命中了该逻辑,如果您尝试用在红框处打上断点观察...int型数据,就应该执行其getIntValue方法即可; Bean中使用了Gson注释,就是打算用Gson来处理序列化和反序列化操作的,因此序列化和反序列化的地方都改用Gson处理; 上述两个思路,我选择了第二种...,因为K8S官方java客户端会依赖Gson; 其次,classpath中不要出现Jackson,为了达到这个目的我们需要做以下操作,排除spring-boot-starter-web的依赖(为什么不直接排除...实例返回,您可以选择先用Gson序列化成JSON字符串,再返回字符串给前端,也可以自己定义VO对象,将V1PodList实例转成VO对象再返回; 至此,使用K8S官方java客户端之前要注意的问题已经弄明白了

1.3K30

Gson 解析 Json 容错才是关键,举几个常用的实例!

2.1 什么是 TypeAdapter TypeAdapter 是 GSON 2.1 版本开始支持的一个抽象类,用于接管某些类型的序列化和反序列化。...因为这里的场景中,只需要反序列化的操作,所以我们实现 JsonDeserializer 接口即可,接管的是 Int 类型。直接上例子吧。...但是在列表为空的时候,服务端返回的数据,什么情况都有可能。...到这一步就很灵活了,你可以直接用 Gson 将数据反序列化成一个 List,也可以将通过一个 for 循环将其中的每一项单独反序列化。...使用了 Gson 之后,遇到花括号 {} 会生成一个 JsonObject,而字符串则是基本类型的 JsonPrimitive 对象,它们在 Gson 内部的解析流程是不一样的,这就造成了 IllegalStateException

3.2K20

除了FastJson,你还有选择: Gson简易指南

前言 这个周末被几个技术博主的同一篇公众号文章 fastjson又被发现漏洞,这次危害导致服务瘫痪! 刷屏,离之前的漏洞事件没多久,FastJson 又出现严重 Bug。...目前项目中不少使用了 FastJson 做对象与JSON数据的转换,又需要更新版本重新部署,可以说是费时费力。...Gson 基本使用 使用 Gson 框架进行序列化与反序列操作,都离不开 com.google.gson.Gson 对象,它也是 Gson 框架的关键对象,提供的公共 API 具备了多种序列化和反序列方式...//true } JsonObject 使用 addProperty(property,value) 方法只能用来添加 String,Number,Boolean,Character这四类数据, 因为内部是调用...而这里 TypeToken 是 Gson 为了支持泛型而引入的类,来解决 Java 无法提供泛型类型表示的问题,由于 TypeToken 的构造方法是protected修饰的,无法直接构造,使用就需要写成

1.3K30

Gson 解析 Json 容错策略

2.1 什么是 TypeAdapter TypeAdapter 是 GSON 2.1 版本开始支持的一个抽象类,用于接管某些类型的序列化和反序列化。...因为这里的场景中,只需要反序列化的操作,所以我们实现 JsonDeserializer 接口即可,接管的是 Int 类型。直接上例子吧。...但是在列表为空的时候,服务端返回的数据,什么情况都有可能。...到这一步就很灵活了,你可以直接用 Gson 将数据反序列化成一个 List,也可以将通过一个 for 循环将其中的每一项单独反序列化。...使用了 Gson 之后,遇到花括号 {} 会生成一个 JsonObject,而字符串则是基本类型的 JsonPrimitive 对象,它们在 Gson 内部的解析流程是不一样的,这就造成了 IllegalStateException

1.2K41

重学springboot系列之JSON处理工具类

性能比较:笔者看多很多的关于这三个类库的性能测试,总结如下: 序列化过程性能:fastjson >= jackson > GsonGson在数据并发量较大时会与其他二者有较明显差距。...说白了就是把对象转成可传输、存储的格式(json、xml、二进制、甚至自定义格式)叫做序列化。反序列化顾名思义。...JsonPropertyOrder,content在先,title在后 因为定义了JsonIgnore,id属性被忽略 因为定义了JsonProperty,author属性变为auther 因为定义了...indent_output: false #某些类对象无法序列化的时候,是否报错 fail_on_empty_beans: false #设置空如何序列化,见下文代码方式详解...方式一无法解决的问题,尝试使用方式二。

2.3K10

除了FastJson,你还有选择: Gson简易指南

前言 前几天被几个技术博主的同一篇公众号文章 fastjson又被发现漏洞,这次危害导致服务瘫痪! 刷屏,离之前漏洞事件没多久,fastjson 又出现严重 Bug。...目前项目中不少使用了 fastjson 做对象与JSON数据的转换,又需要更新版本重新部署,可以说是费时费力。...对象行为序列化对象时会将 null 值的字段忽略,而 com.google.gson.GsonBuilder#serializeNulls 方法将允许 Gson 对象序列化 null 字段;并且正常序列化后的...; //true } JsonObject 使用 addProperty(property,value) 方法只能用来添加 String,Number,Boolean,Character这四类数据, 因为内部是调用...而这里 TypeToken 是 Gson 为了支持泛型而引入的类,来解决 Java 无法提供泛型类型表示的问题,由于 TypeToken 的构造方法是protected修饰的,无法直接构造,使用就需要写成

1.6K40

大型项目废弃fastjson迁移至Gson保姆级攻略

现在看来,flag有用了。。。 本篇文章是我这一个多月来帮助组内废弃fastjson框架的总结,我们将大部分Java仓库从fastjson迁移至了Gson。...并且,对于业务方和产品团队来说,没有新的功能上线,但是系统却炸了,是一件“无法忍受”的事情。...看起来就没有fastjson方便,因为放入List是以gson.toJsonTree(user)的形式放入的。...fastjson:Date直接解析为Unix Gson:直接序列化为标准格式Date [1610445595059-image.png] 导致了Gson在反序列化这个json的时候,直接报错,无法转换为...Swagger异常 这个问题和上面的SpringBoot异常类似,是因为在SpringBoot中引入了Gson,导致 swagger 无法解析 json。

1.8K40

【Netty】「项目实战」(三)序列化算法选型对聊天室扩展性的影响

前言 本篇博文是《从0到1学习 Netty》中实战系列的第三篇博文,主要内容是围绕不同的序列化算法对聊天室的扩展性影响展开讨论,并涉及自定义配置、扩展测试和 BUG 解决等关键方面,往期系列文章请访问博主的...Netty 可以通过集成第三方库(如 Jackson、Gson)来实现对象到 JSON 字符串的序列化和反序列化。...---- 需要注意以下几点: 序列化和反序列化方法都使用了泛型 ,使得这两个方法可以用于不同类型的对象。...反序列化过程中,如果传入的字节数组无法正确反序列化为指定类型的对象,会抛出 ClassNotFoundException 异常。...,会出现以下报错: 这是因为 MessagePack 找不到类模板,其中一种解决方法就是添加 Message 注解: 另一种解决方法就是使用 register 方法进行注册: 后记 总而言之,选择合适的序列化算法对于其扩展性起着重要的影响

24331
领券