Сериализация работает только при вызове статического метода main класса JavaFX App. - PullRequest
0 голосов
/ 16 апреля 2019

Я работаю над проектом, который использует JavaFX для GUI (я знаю, не сериализуемый). Я хочу сериализовать объекты, такие как мои пользователи.

Я не могу получить доступ к экземпляру, который использует приложение JavaFX, но он связан с другими классами.

Например - это связано с моим классом контроллера:

public class MyApp extends Application {
    public void start(Stage stage){
         // ... assume controller loaded
         controller.setApp(this);
    }
}

public class Controller {
    MyApp app;

    public setApp(MyApp app){
        this.app = app
    }
}

Теперь, когда я иду сериализовать экземпляр MyApp, у меня возникают трудности. Я нашел небольшой трюк (вариант 1), но он выглядит немного грязно. Я бы предпочел сделать вариант 2.

Вариант 1 [РАБОТЫ] - создать дополнительный экземпляр в методе main.

public class MyApp extends Application {
    public void start(Stage stage){
         // ... assume controller loaded
         controller.setApp(this);
    }
    public static void main(String[] args){
        MyApp app = new MyApp(); // this is a different instance than javafx instance.
        launch(args)
        app.users = Controller.getUsers();
        writeApp(app);
    }
    public static void writeApp(PhotoApp photoApp) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new 
        FileOutputStream(storeDir + File.separator + storeFile));
        oos.writeObject(photoApp);
        oos.close();
    }
}

Таким образом, вариант 1 по существу создает новый экземпляр и копирует материал назад и вперед из фактического экземпляра в controller.

ВАРИАНТ 2 [НЕ РАБОТАЕТ] - сериализовать экземпляр, связанный с контроллером (поскольку это фактический экземпляр, который используется JavaFX)

public class Controller {
    MyApp app;

    public void setApp(MyApp app){
        this.app = app
    }

    public void someAction(){
        MyApp.writeApp(this.app);
    }
}

Когда я делаю Вариант 2 Я получаю сообщения об ошибках Controller is not serializable. Я понимаю, что это не так (что нормально), но я не получаю эту ошибку в Вариант 1 . В обоих вариантах я вызываю один и тот же метод с некоторым экземпляром MyApp. Я не уверен, почему это работает для Вариант 1 , но не Вариант 2 .

Любая причина, почему один вариант работает над другим? Как большинство людей выполняют сериализацию некоторых своих объектов при использовании JavaFX?

...