这个栈溢出的打印信息连出处都没有,找来找去才发现是一个类引用了 netty 的 Channel 类型,给 Channel 加上 transient 就可以了。
接下来就是我的疑问了,为啥 gson 不能打印 Channel 类型?我猜测是 Java 的锅。但是 Channel 即使是复合类型那还是由基本类型组成的不是吗?
我换 golang 创建一个 tcp 的 net.Listener 然后用原生 json 就能打印,只不过打印出来的是{}
1
pursuer 2019-08-24 10:23:20 +08:00
即使是基本类型,A 对象有 B 的引用,B 又有 A 引用,最后 json 生成出来一环套一环死循环递归不就爆栈了
|
2
Cbdy 2019-08-24 10:26:28 +08:00 via Android
代码 Bug 怪语言设计?
|
3
gramyang OP @pursuer 会不会有这种情况,因为 java 里面有一些包装类和 String 这样的类型,所以会导致即使是基本类型也会互相引用,因而造成栈溢出
|
4
arrow8899 2019-08-24 10:40:10 +08:00
直接报错没问题啊,一个 tcp 连接 你序列化他干啥,如果不报错,你是不是还想在另一边把他反序列化回来?善用 Serializable
|
5
secondwtq 2019-08-24 10:41:02 +08:00 via iPad
@gramyang 正常的 String 不会有对其他对象的引用,但是正常的其他对象可能有和其他对象之间的互相引用
正常的序列化应该做一个 pointer swizzling,而不是直接转 json |
7
chendy 2019-08-24 12:04:44 +08:00
1. 序列化框架(一般)有处理这种场景的功能和配置(限制递归深度,配置不递归之类)
2. 序列化 Channle 是要做什么? 3. 基本类型没有引用,包装类型也没见能互相引用的情况,String 也不会,互相应用一般都是业务对象,配置正确就好 |