4

SingleTon オブジェクトをシリアライズ可能にするために、stackoverflow.com で実行されている多くのスレッドを見つけました。また、専門家は Singleton オブジェクトをシリアライズする方法を提供しています。

私の意見では、
SingleTon 参照変数は同じクラスで静的であるため、Serializable インターフェイスを実装しても、singleton オブジェクトを Serialize することはできません。
また、シリアライゼーション api は、静的参照の状態をファイルにシリアライズまたは書き込むことはできないと言っています。
また、一時変数の状態を保存することもできません。
シリアル化プロセス (実際の書き込みプロセス) の間、静的変数と一時変数は無視されます。
私が誤解した場合は、貴重な情報を提供してください。誤解した場合、Singleton オブジェクトをコード例でシリアル化するのを手伝ってくれる人はいますか?

4

3 に答える 3

2

シングルトンの実装方法とオブジェクトのシリアル化方法を混同していると思います。

シングルトンを実装するためによく使用される静的フィールドは、インスタンスのシリアル化の一部として実際にはシリアル化されませんが、インスタンス自体は確実にシリアル化できます。デシリアライズされたバージョンを静的フィールドに戻すだけです。これは、コードで手動で行う必要があります。

PSシングルトンをシリアル化(または実装)することが必ずしも良い考えだと言っているわけではないことに注意してください。私が言っているのは、それができるということだけです。

于 2013-02-20T13:06:28.903 に答える
1

シングルトンはシリアル化できます。これを行う方法のコードは次のとおりです。


import java.io.Serializable;

public class MySingleton implements Serializable {

    private MySingleton(String name) {
        this.name = name;
    }

    private static MySingleton mySingleton;

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static MySingleton getInstance(String name) {
        if(mySingleton == null) {
            System.out.println("in if...");
            mySingleton = new MySingleton(name);
        }

        return mySingleton;
    }
}

上記の Singleton クラスのインスタンスを取得し、それをシリアル化および逆シリアル化する「メイン」メソッドは次のとおりです。



 public static void main (String[] args) {

        MySingleton m = MySingleton.getInstance("Akshay");

        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D://temp.ser"));
            oos.writeObject(m);

            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D://temp.ser"));
            MySingleton m2 = (MySingleton) ois.readObject();
            System.out.println(m2.getName());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

出力は次のとおりです。

もし...

アクシャイ

ありがとう。

于 2014-04-29T07:35:55.513 に答える
1

はい、静的参照はシリアル化されません。これは、静的参照 (シングルトン インスタンス) の値を取得して、それをシリアル化することを選択できなかったという意味ではありません。

于 2013-02-20T13:05:28.450 に答える