java gson序列化_java – Gson多态序列化

使用Gson 2.2.2我正在尝试序列化POJO(行为)的数组列表.

我有一个适配器几乎是我在网上看到的副本:

public class BehaviorAdapter implements JsonSerializer {

private static final String CLASSNAME = "CLASSNAME";

private static final String INSTANCE = "INSTANCE";

@Override

public JsonElement serialize(Behavior src, Type typeOfSrc,

JsonSerializationContext context) {

JsonObject retValue = new JsonObject();

String className = src.getClass().getCanonicalName();

retValue.addProperty(CLASSNAME, className);

JsonElement elem = context.serialize(src);

retValue.add(INSTANCE, elem);

return retValue;

}

}

我这样注册:

GsonBuilder builder = new GsonBuilder();

builder.registerTypeHierarchyAdapter(Behavior.class, new BehaviorAdapter());

gson = builder.create();

然后,当我尝试序列化我的ArrayList时:

String json2 = gson.toJson(behaviors);

我得到一个堆栈溢出.

它似乎在线:

JsonElement elem = context.serialize(src);

它启动一个递归循环,一次又一次地通过我的序列化器.那么如何注册它以便不会发生这种情况?我需要序列化列表并维护多态性.

解决方法:

However, you should never invoke it on the src object itself since that will cause an infinite loop (Gson will call your call-back method again).

我能想到的最简单的方法是创建一个没有安装处理程序的新Gson实例,然后通过它运行实例.

作为最终运行,您可以序列化List< Behavior>代替:

public class BehaviorListAdapter implements JsonSerializer> {

private static final String CLASSNAME = "CLASSNAME";

private static final String INSTANCE = "INSTANCE";

@Override

public JsonElement serialize(List src, Type typeOfSrc,

JsonSerializationContext context) {

JsonArray array = new JsonArray();

for (Behavior behavior : src) {

JsonObject behaviorJson = new JsonObject();

String className = behavior.getClass().getCanonicalName();

behaviorJson.addProperty(CLASSNAME, className);

JsonElement elem = context.serialize(behavior);

behaviorJson.add(INSTANCE, elem);

array.add(behaviorJson);

}

return array;

}

}

GsonBuilder builder = new GsonBuilder();

// use a TypeToken to make a Type instance for a parameterized type

builder.registerTypeAdapter(

(new TypeToken>() {}).getType(),

new BehaviorListAdapter());

gson = builder.create();

标签:java,gson

来源: https://codeday.me/bug/20190713/1450552.html

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

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

相关文章

【云图】如何制作附近实体店的地图?-微信微博支付宝

【云图】如何制作附近实体店的地图&#xff1f;-微信微博支付宝 原文:【云图】如何制作附近实体店的地图&#xff1f;-微信微博支付宝 摘要&#xff1a; 附近连锁店地图与全国连锁店地图&#xff0c;最大的区别就是&#xff1a; 1、附近连锁店地图需要先定位&#xff0c;然后搜…

php curl跨域cookie_PHP curl模拟文件上传(接口请求实现跨域文件中转)

3e2f08c0c11a8416dd107bbfc9159718.jpg客户端代码请求参数参数类型参数说明$urlstringpost提交的服务器url路径$data数组表单数据$files数组表单文件public function curl_custon_postfields($url, array $data array(), array $files array()){$curlfiles array();foreach …

oracle 分页_80分页查询,不止写法

据孔老先生说,茴香豆的茴字有四种写法,那oracle的分页查询又有多少种写法呢?分页查询,其实本质上就是topN查询的变种, 如果把topN的一部分结果集去掉,就变成了分页.topN的基本写法,两层select,第一层先order by,第二层再用rownum:select owner,object_name,object_id,rownum a…

笔记:Hadoop权威指南 第1章 初识Hadoop

大数据处理遇到问题&#xff1a; (1)、磁盘存储容量快速增加&#xff0c;但是访问速度进步不大&#xff1b;用户乐意使用磁盘共享访问。 (2)、硬件故障&#xff0c;可以使用备份解决。 (3)、分布式系统&#xff0c;需要可靠性。 关系数据库与MapReduce比较&#xff1a; (1)、磁…

php switch if,php switch 与 if else 区别

在php中switch是选择&#xff0c;if else也有同理&#xff0c;但是它们肯定是有区别的&#xff0c;那么我们来看看它们两者的区别在哪里呢&#xff0c;下面先看switch case语句吧。switch($id){case 1:return asp/;break;case 2:return phper/;break;case 3:return jsp/;break;…

python读取mat数据是字典形式如何转化为矩阵_mat2json, python读取mat成字典, 保存json...

python程序, 实现matlab的.mat格式转化为dict / json .第一个参数mat_path代表需要转化的mat路径;第二个参数, 如果需要把字典序列化成json, 添加这一参数, 代表json存放位置;返回值: 转化好的字典import osimport jsonimport scipy.io as spioimport pandas as pddef loadmat(…

GitHub上创建组织

4.3. 组织和团队 GitHub 在早期没有专门为组织提供账号&#xff0c;很多企业用户或大型开源组织只好使用普通用户账号作为组织的共享账号来使用。后来&#xff0c;GitHub推出了组织这一新的账号管理模式&#xff0c;满足大型开发团队的需要。 组织账号是不能用来登录的&#xf…

jquery根据value值php,表单php传值后jquery清除表单某项value问题

表单php文件我现在写了一个jquery打算每次提交后清除姓名中的内容代码如下$(function() { $(:input,#recordform) .not(:button, :submit, :reset, :hidden) .val() })请问怎么使用啊 加在哪个都无法实现提交后清除姓名求助&#xff01;回复讨论(解决方案)不知道你的 js 函数 c…

python未将对象引用设置到对象的实例_在Python中使用pingarapi。服务器引发Webfault:对象引用未设置为对象的实例...

大家晚上好。我想说的是&#xff0c;我对wsdl、soap、suds这整件事都很陌生&#xff01;尽可能多地提供信息。wsdl是这个http://api3.pingar.com/PingarAPIService.asmx?WSDL我花了好几个小时试图找出我正在使用的代码有什么问题&#xff0c;但最终还是一无所获。我借用了这里…

php 网站上传大小限制吗,配置PHP程序网站上传文件大小的限制!

PHP程序做的网站&#xff0c;上传文件大小的限制&#xff0c;是在PHP的配置文件中设置的。WORDPRESS网站也是PHP程序&#xff0c;我们会在WordPress里面的很多地方遇到文件上传大小的限制&#xff0c;比如在媒体库里面&#xff0c;上传图片&#xff1b;恢复数据时&#xff0c;上…

python元组元素抓7_Python3基础 tuple 通过拆分元组向元组中加入新的元素

Python : 3.7.0OS : Ubuntu 18.04.1 LTSIDE : PyCharm 2018.2.4Conda : 4.5.11typesetting : Markdowncode"""Author : 行初心Date : 18-9-23Blog : www.cnblogs.com/xingchuxinGitee : gitee.com/zhichengjiu"""def main():new_members (阳明贪…

Hypothesis, 一个很少人会用的Python测试库

在软件开发中&#xff0c;测试是保证代码质量和功能正确性的重要环节。为了提高测试的覆盖率和效率&#xff0c;开发者们创造了许多测试框架和工具。其中 Hypothesis 是一个强大且受欢迎的 Python 测试库&#xff0c;它利用属性基测试的思想&#xff0c;可以自动生成测试数据并…

用户留存 数据统计 php,位运算实现用户留存率

统计留存率之前先弄清一下留存率的概念&#xff0c;百度百科中是这么说的&#xff1a; 用户在某段时间内开始使用应用&#xff0c;经过一段时间后&#xff0c;仍然继续使用应用的被认作是留存&#xff1b;这部分用户占当时新增用户的比例即是留存率&#xff0c;会按照每隔1单位…

php mcrypt取消,php – Mcrypt弃用后如何解密?

我已将我的php版本更新为7.1.我有使用mcrypt加密数据的功能.现在不推荐使用此功能.无论如何我都可以通过回到旧版本的php来解密数据.这是我使用的代码&#xff1a;public function encrypt($plaintext) {$ivSize mcrypt_get_iv_size(self::CIPHER, self::MODE);$iv mcrypt_cr…

线条边框简笔画图片大全_儿童简笔画画大全人物

由于简笔画有概括、形象、幽默、简练的特点,符合儿童生理、心理发展的需要,便于儿童接受与掌握。儿童简笔画画大全人物有哪些呢?下面由学习啦小编带来的儿童简笔画画大全人物&#xff0c;欢迎欣赏!儿童人物简笔画画图片大全欣赏儿童简笔画画人物图1&#xff1a;跳舞的小女孩简…

求两条轨迹间的hausdorff距离_题型 | 圆上有n个点到直线距离为d?

圆上有n个点到直线的距离为d圆 上到直线 的距离为 的点有&#xff08; &#xff09;个方法一&#xff1a;常规方法&#xff0c;画图分析由图象可以明显看出&#xff0c;圆在直线上方的部分内没有满足题意的点&#xff0c;在直线下方的部分内有两个满足题意的点。但是这样的方法…

java字符串包含连续数字,Java中包含数字的排序字符串

小编典典尝试使用此比较器&#xff0c;该比较器将删除所有非数字字符&#xff0c;然后将其余字符与数字进行比较&#xff1a;Collections.sort(strings, new Comparator() {public int compare(String o1, String o2) {return extractInt(o1) - extractInt(o2);}int extractInt…

MyEclipse的Debug模式

在MyEclipse中使用debug模式 1, 首先在一个java文件中设断点&#xff0c;然后运行&#xff0c;当程序走到断点处就会转到debug视图下&#xff0c; 2, F5键与F6键均为单步调试&#xff0c;F5是step into,也就是进入本行代码中执行&#xff0c;F6是step over&#xff0c; 也就是执…

redis setnx 分布式锁_Redis 分布式锁PHP

Redis 分布式锁的作用在单机环境下&#xff0c;有个秒杀商品的活动&#xff0c;在短时间内&#xff0c;服务器压力和流量会陡然上升。这个就会存在并发的问题。想要解决并发需要解决一下问题1、提高系统吞吐率也就是qps 每秒处理的请求书解决问题一&#xff1a;采用内存型数据库…

mysql备份至本地,mysql备份(本地+远程)

整体规划生产环境的mysql数据库&#xff0c;应当每日进行备份&#xff0c;并对较远之前的备份进行删除&#xff0c;由于担心mysql服务器本身崩溃&#xff0c;因此需要考虑将备份的文件同时保存到其他服务器&#xff0c;这样能提高数据安全。备份的方式使用mysqldump&#xff0c…