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这可能是我遇到的问题的解决方案,需要很长时间才能详细解释…谢谢!我不知道你可以控制这个过程