4

我发现在 stackoverflow.com 中运行了许多线程,用于使 SingleTon 对象可序列化。专家们也在提供序列化 Singleton 对象的方法。

在我看来,即使我们实现了 Serializable 接口,我们也无法序列化单例对象,
因为 SingleTon 引用变量在同一个类中是静态的。
并且序列化 api 说我们不能在文件中序列化或写入静态引用的状态。
而且我们也不能保存瞬态变量的状态。
而序列化过程(实际写入过程)静态和瞬态变量被忽略。
如果我误解了,请提供您宝贵的意见。如果我误解了,有人可以用代码示例帮助序列化 Singleton 对象吗?

4

3 回答 3

2

我认为您混淆了单例的实现方式和对象的序列化方式。

虽然经常用于实现单例的静态字段确实不会作为序列化实例的一部分进行序列化,但实例本身绝对可以序列化。您需要做的就是将其反序列化版本设置回静态字段,您需要在代码中手动执行此操作。

PS请注意,我并不是说序列化(甚至实现)单例一定是一个好主意,我只是说它可以完成。

于 2013-02-20T13:06:28.903 回答
1

是的,静态引用没有序列化。这并不意味着您不能获取静态引用(单例实例)的值并选择对其进行序列化。

于 2013-02-20T13:05:28.450 回答
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;
    }
}

这是“main”方法,它获取上面的 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 回答