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

Java 使用readResolve()序列化静态字段,java,serialization,static,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(

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

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;
    }
}

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

静态成员变量不属于类的任何特定实例。当你说-
ClassA.num2=num2
,您不能访问任何特定实例的静态变量
num2
。您使用类名进行访问,这就是在您的示例中访问静态变量的方式(因为参数和静态变量都具有相同的名称)


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

也许您可以实现专用的
私有void writeObject(ObjectOutputStream out)抛出IOException私有void readObject(ObjectInputStream in)抛出IOException、ClassNotFoundException当您必须反序列化对象时

通过这种方式,您可以自定义序列化/反序列化过程


看。

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

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


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

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

即使您确实像以前那样进行序列化,也会给您带来很多问题。每个序列化对象的值可能不同


反序列化时将使用哪个值?您无法确定哪一个是正确的。

静态字段不是ObjectI know状态的一部分,但我仍然希望在序列化时保存静态字段的值。为什么要序列化这些值?当您让te反序列化序列化对象时,您希望如何处理静态值?最后序列化的值将是所有类实例共享的值…@reef这可能是我遇到的问题的解决方案,需要很长时间才能详细解释…谢谢!我不知道你可以控制这个过程