- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一款 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
.
正如预期的那样,当我尝试将旧类反序列化为新类时,出现以下异常:
Caused by: java.io.InvalidClassException: com.my.package.A; Incompatible class (SUID): com.my.package.A: static final long serialVersionUID =9103658319690261655L; but expected com.my.package.A: static final long serialVersionUID =7863476896806312319L; at java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2336) at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1643) at 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)
所以,进入我的类(class)A
,我尝试指定 serialVersionUID
具有预期值的静态字段:
private static final long serialVersionUID = 7863476896806312319L;
但是我的应用程序仍然崩溃...我现在有以下堆栈跟踪:
Caused by: java.io.InvalidClassException: com.my.package.A; Incompatible class (SUID): com.my.package.A: static final long serialVersionUID =7863476896806312319L; but expected com.my.package.A: static final long serialVersionUID =9103658319690261655L; at java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2336) at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1643) at 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
领域...
所以问题是:如何恢复我的数据并强制将旧类反序列化为新类?
感谢您的帮助。
最佳答案
查看一个密切相关的问题here ,我认为您应该尝试将 serialVersionUID
设置为 9103658319690261655L
的预期值。
请尝试设置:
private static final long serialVersionUID = 9103658319690261655L;
希望这对您有所帮助,尝试一下并告诉我们。
关于java - InvalidClassException 不兼容的类 (SUID),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37575714/
在我的程序中,我有一个 FacebookUser 类,其中包含该用户的所有 friend 的 ArrayList。所有这些 friend 也可能有 friend 。我正在使用递归来获取一个新的 Arr
我在与同事的代码集成时遇到一些问题。 他有一个实体类,我们称之为FooEntity: @Entity @XmlRootElement @Table(name = "...") public class
InvalidClassException: local class incompatible: stream classdesc serialVersionUID = -19641044047501
这个问题已经有答案了: What is a serialVersionUID and why should I use it? (25 个回答) 已关闭 9 年前。 请告诉我我该怎么做这个异常即将到来
在我的实现中,我使用 Java 序列化来发送一组二进制对象,这些二进制对象以通知 header 开头,通知 header 告知将传递多少个对象以及它们各自的大小。首先进行简单的测试,我能够成功传输 h
我是 RMI 新手。从java文档中我发现当本地和远程文件中的串行版本不匹配时会抛出InvalidClassException。但我写了一个虚拟类,即使静态创建的serialVersionUID,它也
读完连载后,我尝试对书中提供的示例进行实验。以下代码有一些变化,这基本上是从 SCJP 书中挑选的。 import java.io.FileInputStream; public class Seri
此错误并不典型,通常我只需在本地定义serialVersionUID即可解决该错误。这次我将其定义如下: private static final long serialVersionUID = -4
这是我第一次在android上画东西。我按照developers.android.com 上的教程进行操作: http://developer.android.com/training/custom-
这个问题已经有答案了: java.io.invalidClassException during serializing/deserializing (3 个回答) 已关闭 7 年前。 我正在开发一款
我在数据库中保存了一个 java 对象,然后几天后我更改了我的 jre 版本。现在,当我尝试读取同一个对象时,出现以下异常: Exception in thread "main" java.io.In
我正在尝试序列化一个对象,然后在将其数据发送到客户端程序后将其反序列化。 这是对象继承如何工作的示例。我正在序列化和反序列化的对象是人。 生活 -> 动物 -> NPC -> 人 -> child L
我正在解决这个问题,但收到此错误无法指出错误: 这是我的课: package stdaccmdmngmt; import java.io.File; import java.io.FileInputS
这个问题已经有答案了: 奥 git _a (5 个回答) 已关闭 9 年前。 我不知道为什么会发生这种情况。 class Course implements Serializable {
每当我尝试在项目中运行它时,我都会在运行时遇到异常。 EXCEPTION MESSAGE :Message : java.io.InvalidClassException: com.mypackage
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
public static void save(Settings settings) { try { ObjectOutputStream os =
我正在尝试制作在线绘画游戏。为此,我在 Android 中使用 Path 类,我需要将它发送到我的 Java 服务器。为此,我曾尝试扩展 Path 类,如下所示: public class Seria
当我尝试从数据库(mysql)检索blob数据时,出现以下异常。 java.io.InvalidClassException: com.nmsworks.cygnet.tmf.mtnm.element
我在执行 Java 程序时遇到错误。请帮我做什么?错误如下: java.io.InvalidClassException: buddyconnect.UserInfo; local class inc
我是一名优秀的程序员,十分优秀!