Java序列化问题

时间:2009-09-17 12:58:16

标签: java class serialization

我想将我的问题更改为以下内容:

我有一个HashMap对象和一个int。我想序列化到同一个文件并返回。我知道我应该按照与序列化相同的顺序进行反序列化。

请向我提供执行此操作的代码。

2 个答案:

答案 0 :(得分:5)

我根据您提供的信息做出假设,即基于最初序列化类与具有新字段的更新类之间的不兼容性而导致序列化问题。

如果您之前已经序列化了一个类而未指定private static long serialVersionUID,则在尝试读取该文件时,添加一个新字段将导致InvalidClassException。

请注意,只需在之后添加serialVersionUID ,您已经序列化了以前的版本,就不会产生兼容的类。您需要做的是重新生成原始的serialVersionUID,获取该数字并将其应用到您的班级。

您必须采取的步骤:

  1. 删除新的int(现在)并编译
  2. 通过对编译的serialVer运行来生成原始的serialVersionUID 类
  3. 获取结果编号并将其分配给您应用于更新课程的private static long serialVersionUID
  4. 重新添加新的int。
  5. 完成这些步骤后,您可以将原始版本反序列化。

    建议阅读:why should I bother about serialVersionUID (sic)

答案 1 :(得分:1)

如果没有堆栈跟踪,很难猜出确切的问题,但我会想出两个可能性:

运行时的hashmap不包含可序列化的对象。给定您提供的泛型类型,只有在使用原始类型时才可以这样做。如:

public void setMap(HashMap map) { this.map = map; }

那会给你一个编译器警告,但它会编译,所以这样的事情可能会继续。如果您在地图上有一个吸气剂,并且使用其原始类型引用了地图,则会发生同样的事情。说:

public Map<String, String> getMap() { return map; }

Map m = getMap();
m.put(new Object(), new Object());

我能想到的另一种可能性是,当你编写或读取文件时,你会以某种方式破坏文件(例如,在编写文件时使用文件编码或不关闭流)。

如果没有更多信息(完整的堆栈跟踪 - 如果需要,则删除引用您自己的项目名称的行,而没有其他行)以及执行序列化和反序列化的代码,则无法进一步了解问题。

顺便说一下,没有任何评论或回答认为您序列化了HashMap并且想要反序列化MyClass(这实际上是不可能的 - 您无法决定反序列化时获得的类)。我认为你误解了这些评论。他们所谈论的是MyClass的不同版本,因为它们随着时间的推移而存在。我在我的回答中猜测不是这种情况(事实上,你在运行代码时反序列化MyClass并反序列化而没有任何重新编译。如果没有(如果事实上你已经序列化了类,改变了它,并且重新编译并试图重新读取旧文件),然后akf对Tom的评论的回答是正确的。