【问题标题】:Deserializing Singleton反序列化单例
【发布时间】:2018-03-18 10:53:18
【问题描述】:
    //Singleton
    public class MainList implements Serializable {
            private static MainList instance = new MainList();
            private MainList() {}

            public static MainList getInstance() {
                return instance;
            }
        }

    //Trying to deserialize..
    public MainWindow() {
        //Importing the latest version if it exists in path
        MainList mainListObj = MainList.getInstance();
        try {
            FileInputStream fis = new FileInputStream(path);
            ObjectInputStream oin = new ObjectInputStream(fis);
            mainListObj = (MainList) oin.readObject(); //HERE//////
        }
        catch (Exception exc) {
            return;
        }
    }

MainList类的Singleton-Object被序列化&可以通过路径找到。

就行 //HERE/// 对象成功反序列化为mainListObj, 但它是本地的..

我怎样才能让它全球化?我认为这可以通过改变 getInstance 方法来解决..不知何故..

【问题讨论】:

  • 将您在 HERE 获得的值设置为 MainList 的 INSTANCE ?
  • 如果您可以反序列化和替换实例,那么它不是单例。因此答案是“你不能反序列化一个单例”。
  • 你说得对,但是
  • 我不想替换它,我想创建一个新的(第一个),使用我反序列化的 obj..
  • 在解决这个问题之前,您需要了解“Java 通过值传递引用”是什么意思。您在代码中所做的所有操作都被重新分配了一个引用。另外:您可能想研究如何关闭外部资源。

标签: java serialization singleton deserialization singleton-methods


【解决方案1】:

你的情况不是singleton

在你的情况下,你可以简单地提供一个 setter。

static void setInstance(MainList newInstance) {
 instance = newInstance;
}

MainList.setInstance(mainListObj);

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    相关资源
    最近更新 更多