Невозможно сериализовать корневой узел JTree (groovy / java)

Я работаю над приложением Swing, которое в основном включает в себя JTree и некоторые другие компоненты. Полная логика отображения пользовательского интерфейса основана на корневом узле JTree. Это вложенный узел с индивидуальными пользовательскими объектами UserObject, установленными для каждого из дочерних узлов.

Мне нужно сохранить состояние моего приложения, для которого должен быть сохранен единственный вложенный корневой узел 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), за которым следует новое отображение пользовательского интерфейса, который выполняет 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) не работает правильно после сериализации. Пожалуйста помоги.


person Vamsi Emani    schedule 19.09.2011    source источник


Ответы (2)


посмотрите на метод invokeLater или лучше для Serializable для invokeAndWait (), потому что код Swing должен выполняться в потоке отправки событий,

правильный путь, создайте JTree с DefaultTreeModel отдельно, а из ваших Serializable методов просто добавить TreeNodes, завернутый в invokeLater

person mKorbel    schedule 19.09.2011
comment
Думаю, это близко к тому, что мне нужно. Не могли бы вы прояснить ясность? - person Vamsi Emani; 20.09.2011

Чтобы SerializableNode был действительно сериализуемым, весь его граф объектов должен быть сериализуемым. Какой тип значения top? Если это невозможно сериализовать, узел при записи выдаст NotSerializableException.

Если top нельзя сделать сериализуемым, вы должны объявить его как transient и реализовать writeResolve и readResolve для правильной записи / чтения несериализуемого значения.

person Jeff Storey    schedule 19.09.2011