序列化仅在JavaFX App类的静态main方法中调用时有效

时间:2019-04-16 15:51:58

标签: java javafx serialization deserialization

我正在一个使用JavaFX作为GUI的项目(我知道,不可序列化)。我想序列化诸如“用户”之类的对象。

我无法访问JavaFX Application使用的实例,但是我将其与其他类相关联。

例如-它与我的Controller类关联:

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 [WORKS] -在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时如何对他们的某些对象进行序列化?

0 个答案:

没有答案