【问题标题】:Unable to serialize a root node of a JTree (groovy/java)无法序列化 JTree 的根节点(groovy/java)
【发布时间】:2011-11-20 06:40:36
【问题描述】:

我正在开发一个 Swing 应用程序,它主要包括一个 JTree 和其中的一些其他组件。 UI 显示背后的完整逻辑基于 JTree 的根节点。它是一个嵌套节点,每个子节点都设置了单独的自定义用户对象。

我需要保留应保留 JTree 的单个嵌套根节点的应用程序的状态。我无法这样做。

class SerializeImpl implements Serializable{

    def doSerialize() throws Exception{
        def root = FeedTree.getInstance().getModel().getRoot()
        def object = new SerializableNode(top:root)
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("new.txt"))
        out.writeObject(object)
    }

    def doDeSerialize(){
        def file = new File('new.txt')
        def serNodeObj
        try{        
            file.withObjectInputStream(getClass().classLoader){ ois ->
                ois.eachObject{ serNodeObj = it }
            }
            return serNodeObj.getValue()
        }
        catch(FileNotFoundException ex){
            return null
        }

    }       

}


class SerializableNode implements Serializable{

    def top

    def getValue(){
        return top
    }

}

class FeedTree extends JTree{

...............
a singleton instance
...............

}

doSerialize() 方法首先执行,然后是 System.exit(1),然后是一个新的 UI 显示,它执行 doDeSerialize().. doSerialize() 方法确实在 news.txt 文件中写入了一些内容,但我没有确定它是否正确地序列化对象。此外,序列化后的System.exit(1) 不起作用。

在强制退出(从 Eclipse 控制台关闭)后,第一次执行 doDeSerialize() 会引发以下异常。

Caught: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: groovy.util.slurpersupport.NodeChildren
    at functionalities.SerializeImpl$_doDeSerialize_closure1.doCall(SerializeImpl.groovy:23)
    at functionalities.SerializeImpl.doDeSerialize(SerializeImpl.groovy:22)

我无法理解为什么序列化(可能)失败以及为什么System.exit(1) 在序列化后无法正常运行。请帮忙。

【问题讨论】:

    标签: java swing groovy jtree serializable


    【解决方案1】:

    为了使SerializableNode 真正可序列化,它的整个对象图必须是可序列化的。 top 是什么类型的值?如果这不是可序列化的,则节点将在写入时抛出NotSerializableException

    如果top不能被序列化,那么你应该将它声明为transient并实现writeResolvereadResolve以正确地写入/读取不可序列化的值。

    【讨论】:

      【解决方案2】:

      查看方法invokeLater or better for Serializable for invokeAndWait(),因为Swing代码必须在Event Dispatch Thread上完成,

      正确的方法,使用 DefaultTreeModel 分别创建 JTree,并从您的 Serializable 方法中添加 TreeNodes 包装到 invokeLater

      【讨论】:

      • 我认为这已经接近我所需要的了。你能解释清楚吗?
      猜你喜欢
      • 2021-08-02
      • 2021-07-14
      • 1970-01-01
      • 2010-12-05
      • 2012-07-13
      • 2015-09-12
      • 2017-12-31
      • 1970-01-01
      • 2011-08-03
      相关资源
      最近更新 更多