【发布时间】:2016-06-01 17:57:35
【问题描述】:
我正在开发一个 Android 应用程序,我必须在其中保留一些数据。为了持久化它们,我使用了java序列化机制。
这里是我要序列化的类的结构:
public final class A
implements Serializable
{
public static final class B
implements Serializable
{
public final String field1;
public final String field2;
public B(String field1, String field2)
{
this.field1= field1;
this.field2= field2;
}
}
public static final class C
implements Serializable
{
public long field1;
public final B field2;
public C(B field2)
{
this.field2 = field2;
}
public void setField1(long field1)
{
this.field1= field1;
}
}
private final List<C> list1= new ArrayList<>();
private final List<C> list2= new ArrayList<>();
public A()
{
}
public List<C> getList1()
{
return list1;
}
public List<C> getList2()
{
return list2;
}
//some other methods
}
如您所见,类实现了Serializable,但我没有指定serialVersionUID 静态字段。
我必须对这个应用程序进行重大更新,并从 A 和 C 类中删除一些方法。
正如预期的那样,当我尝试将旧类反序列化为新类时,出现以下异常:
引起:java.io.InvalidClassException: com.my.package.A; 不兼容的类 (SUID): com.my.package.A: static final long serialVersionUID = 9103658319690261655L;但预期 com.my.package.A: 静态最终长序列版本UID = 7863476896806312319L; 在 java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2336) 在 java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1643) 在 java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:657) 在 java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1782) 在 java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
所以,在我的班级A 中,我尝试用预期值指定serialVersionUID 静态字段:
private static final long serialVersionUID = 7863476896806312319L;
但我的应用程序仍然崩溃...我现在有以下堆栈跟踪:
引起:java.io.InvalidClassException: com.my.package.A; 不兼容的类 (SUID): com.my.package.A: static final long serialVersionUID = 7863476896806312319L;但预期 com.my.package.A: 静态最终长序列版本UID = 9103658319690261655L; 在 java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2336) 在 java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1643) 在 java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:657) 在 java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1782) 在 java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
如您所见,旧的 serialVersionUID 字段现在具有预期值,预期值具有旧 serialVersionUID 字段的值...
所以问题是:如何恢复我的数据并强制将旧类反序列化为新类?
感谢您的帮助。
【问题讨论】:
标签: java android serialization deserialization