使用readResolve()序列化静态字段

时间:2011-02-24 10:41:34

标签: java serialization static

当我序列化一个对象时,我也想拍摄静态字段的“快照”。 以下代码是一个好习惯吗?

public class ClassA implements Serializable {

    private int num1;
    private static int num2 = 5;

    private int num2Saver;

    public int getNum1() {
        return num1;
    }

    public void setNum1(int num1) {
        this.num1 = num1;
    }

    public static int getNum2() {
        return num2;
    }

    public void setNum2(int num2) {
        ClassA.num2 = num2;
        num2Saver = num2;
    }

    private Object readResolve(){
        num2 = num2Saver;
        return this;
    }
}

(请注意,为了设置静态字段,您必须通过实例)

4 个答案:

答案 0 :(得分:1)

也许您可以在编写对象时实现专用的private void writeObject(ObjectOutputStream out) throws IOException;方法来自定义序列化。然后,当您必须反序列化对象时,您将拥有private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

这样您就可以自定义序列化/反序列化过程。

请参阅http://java.sun.com/developer/technicalArticles/Programming/serialization/

答案 1 :(得分:0)

静态成员变量不属于任何特定的类实例。当你说 - ClassA.num2 = num2;时,你没有访问任何特定实例的静态变量num2。您正在使用类名访问,这就是在您的情况下需要访问静态变量的方式(因为参数和静态变量都具有相同的名称)。

使用类名访问时,读者会更清楚它是一个静态变量。如果传递的参数具有不同的名称,那么num2 = numX;就是正确的。但这并没有告诉读者num2是静态变量还是普通的类变量。

答案 2 :(得分:0)

我认为这不是一个好习惯。请记住,静态成员属于全局类,而不属于特定实例。

考虑使用静态成员的不同值序列化两个ClassA实例的情况。序列化表单确实表示静态数据的两个版本。但是,在反序列化这两个实例后,只有一个静态成员的值将保持(最后一个被反序列化)。

换句话说,您使静态成员的值取决于反序列化顺序。

答案 3 :(得分:0)

静态值不应该序列化。如果您确实需要序列化静态值,您可能想重新考虑您的设计。

即使您按照自己的方式进行序列化,也会给您带来很多问题。每个序列化对象的值可能不同。

反序列化时将使用哪个值?你不能决定知道哪一个是正确的。