Невозможно сериализовать корневой узел JTree (groovy / java) - PullRequest
1 голос
/ 19 сентября 2011

Я работаю над свинг-приложением, которое в основном включает в себя 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) после сериализации не работает.

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

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

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

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

2 голосов
/ 19 сентября 2011

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

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

...