由 gson 报栈溢出的一点瞎想

2019-08-24 10:09:44 +08:00
 gramyang

这个栈溢出的打印信息连出处都没有,找来找去才发现是一个类引用了 netty 的 Channel 类型,给 Channel 加上 transient 就可以了。

接下来就是我的疑问了,为啥 gson 不能打印 Channel 类型?我猜测是 Java 的锅。但是 Channel 即使是复合类型那还是由基本类型组成的不是吗?

我换 golang 创建一个 tcp 的 net.Listener 然后用原生 json 就能打印,只不过打印出来的是{}

3867 次点击
所在节点    Java
8 条回复
pursuer
2019-08-24 10:23:20 +08:00
即使是基本类型,A 对象有 B 的引用,B 又有 A 引用,最后 json 生成出来一环套一环死循环递归不就爆栈了
Cbdy
2019-08-24 10:26:28 +08:00
代码 Bug 怪语言设计?
gramyang
2019-08-24 10:31:59 +08:00
@pursuer 会不会有这种情况,因为 java 里面有一些包装类和 String 这样的类型,所以会导致即使是基本类型也会互相引用,因而造成栈溢出
arrow8899
2019-08-24 10:40:10 +08:00
直接报错没问题啊,一个 tcp 连接 你序列化他干啥,如果不报错,你是不是还想在另一边把他反序列化回来?善用 Serializable
secondwtq
2019-08-24 10:41:02 +08:00
@gramyang 正常的 String 不会有对其他对象的引用,但是正常的其他对象可能有和其他对象之间的互相引用
正常的序列化应该做一个 pointer swizzling,而不是直接转 json
arrow8899
2019-08-24 10:42:02 +08:00
@gramyang 循环引用和 tranisant 不可序列化是不一样的
chendy
2019-08-24 12:04:44 +08:00
1. 序列化框架(一般)有处理这种场景的功能和配置(限制递归深度,配置不递归之类)
2. 序列化 Channle 是要做什么?
3. 基本类型没有引用,包装类型也没见能互相引用的情况,String 也不会,互相应用一般都是业务对象,配置正确就好
pursuer
2019-08-24 12:06:39 +08:00
@gramyang 基础类型一般不会,“ Channel 即使是复合类型那还是由基本类型组成的”,虽然说复合类型细分到最后都是基本类型组成的,但是复合类型里的循环引用在生成 json 这样的数据结构时就可能有问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/594679

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX