我正在开发一个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;非兼容类: com.my.package.A:静态最终长serialVersionUID =9103658319690261655L;在java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2336) at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1643)在java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:657) at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1782) at java.io。ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
因此,在我的类A中,我尝试用期望值指定serialVersionUID静态字段:
private static final long serialVersionUID = 7863476896806312319L;但我的应用仍然崩溃..。现在我有了以下堆栈跟踪:
由: java.io.InvalidClassException: com.my.package.A;非兼容类: com.my.package.A:静态终长serialVersionUID =7863476896806312319L;在java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2336) at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1643)在java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:657) at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1782) at java.io。ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
如您所见,旧serialVersionUID字段现在具有预期字段的值,而预期字段具有旧serialVersionUID字段的值.
因此,问题是:如何恢复数据并强制将旧类反序列化为新类?
谢谢你的帮助。
发布于 2016-06-01 18:36:56
考虑到一个与here密切相关的问题,我认为您应该尝试将serialVersionUID设置为9103658319690261655L的期望值。
请尝试设置:
private static final long serialVersionUID = 9103658319690261655L;我希望这有帮助,试一试,让我们知道。
https://stackoverflow.com/questions/37575714
复制相似问题