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

由 gson 报栈溢出的一点瞎想

  •  
  •   gramyang · 51 天前 · 1464 次点击
    这是一个创建于 51 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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