当我序列化一个对象时,我也想拍摄静态字段的“快照”。 以下代码是一个好习惯吗?
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;
}
}
(请注意,为了设置静态字段,您必须通过实例)
答案 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)
静态值不应该序列化。如果您确实需要序列化静态值,您可能想重新考虑您的设计。
即使您按照自己的方式进行序列化,也会给您带来很多问题。每个序列化对象的值可能不同。
反序列化时将使用哪个值?你不能决定知道哪一个是正确的。