V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gramyang
V2EX  ›  Java

由 gson 报栈溢出的一点瞎想

  •  
  •   gramyang · 2019-08-24 10:09:44 +08:00 · 3832 次点击
    这是一个创建于 1917 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    8 条回复    2019-08-24 12:06:39 +08:00
    pursuer
        1
    pursuer  
       2019-08-24 10:23:20 +08:00
    即使是基本类型,A 对象有 B 的引用,B 又有 A 引用,最后 json 生成出来一环套一环死循环递归不就爆栈了
    Cbdy
        2
    Cbdy  
       2019-08-24 10:26:28 +08:00 via Android
    代码 Bug 怪语言设计?
    gramyang
        3
    gramyang  
    OP
       2019-08-24 10:31:59 +08:00
    @pursuer 会不会有这种情况,因为 java 里面有一些包装类和 String 这样的类型,所以会导致即使是基本类型也会互相引用,因而造成栈溢出
    arrow8899
        4
    arrow8899  
       2019-08-24 10:40:10 +08:00
    直接报错没问题啊,一个 tcp 连接 你序列化他干啥,如果不报错,你是不是还想在另一边把他反序列化回来?善用 Serializable
    secondwtq
        5
    secondwtq  
       2019-08-24 10:41:02 +08:00 via iPad
    @gramyang 正常的 String 不会有对其他对象的引用,但是正常的其他对象可能有和其他对象之间的互相引用
    正常的序列化应该做一个 pointer swizzling,而不是直接转 json
    arrow8899
        6
    arrow8899  
       2019-08-24 10:42:02 +08:00
    @gramyang 循环引用和 tranisant 不可序列化是不一样的
    chendy
        7
    chendy  
       2019-08-24 12:04:44 +08:00
    1. 序列化框架(一般)有处理这种场景的功能和配置(限制递归深度,配置不递归之类)
    2. 序列化 Channle 是要做什么?
    3. 基本类型没有引用,包装类型也没见能互相引用的情况,String 也不会,互相应用一般都是业务对象,配置正确就好
    pursuer
        8
    pursuer  
       2019-08-24 12:06:39 +08:00
    @gramyang 基础类型一般不会,“ Channel 即使是复合类型那还是由基本类型组成的”,虽然说复合类型细分到最后都是基本类型组成的,但是复合类型里的循环引用在生成 json 这样的数据结构时就可能有问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   988 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:54 · PVG 03:54 · LAX 11:54 · JFK 14:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.