首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java序列化问题

Java序列化问题
EN

Stack Overflow用户
提问于 2009-09-17 12:58:16
回答 2查看 3.3K关注 0票数 0

我想将我的问题改为以下几点:

我有一个HashMap对象和一个int对象。我想将序列化到同一个文件中,然后返回。我知道我应该以与序列化相同的顺序进行反序列化。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-17 13:03:22

基于您提供的信息,我做了一个假设,即由于最初序列化的类和具有新字段的更新类之间的不兼容性,您遇到了序列化问题。

如果您以前序列化了一个类,但没有指定private static long serialVersionUID,则添加新字段将导致在尝试读回文件时出现InvalidClassException。

请注意,在序列化以前的版本之后简单地添加serialVersionUID不会产生兼容的类。您需要做的是重新生成原始的serialVersionUID,获取该编号并将其应用于您的类。

您必须采取的步骤:

  1. 删除新的int (暂时),并通过对编译的类运行serialVersionUID来删除原始代码
  2. 获取结果数字并将其分配给您要应用于更新的类的private static long serialVersionUID
  3. 重新添加新的int。

完成这些步骤之后,您应该可以反序列化原始代码了。

推荐阅读:why should I bother about serialVersionUID (sic)

票数 6
EN

Stack Overflow用户

发布于 2009-09-17 18:37:17

如果没有堆栈跟踪,很难猜测确切的问题,但我将冒险提出两种可能性:

运行时的hashmap不包含可序列化的对象。给定您所呈现的泛型类型,只有在使用原始类型的情况下才有可能实现。例如:

代码语言:javascript
复制
public void setMap(HashMap map) { this.map = map; }

这会给你一个编译器警告,但它会编译,所以可能会发生类似的事情。如果地图上有一个getter,并且某些东西使用它的原始类型引用了地图,那么同样的事情也会发生。可以这样说:

代码语言:javascript
复制
public Map<String, String> getMap() { return map; }

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

我能想到的另一种可能性是,当你写或读文件时,你正在以某种方式损坏文件(比如,在你写它的时候做一些文件编码的事情,或者不关闭流)。

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

顺便说一句,没有任何注释或答案认为您序列化了HashMap并想要反序列化MyClass (这实际上不可能--您无法决定反序列化时会得到什么类)。我认为你误解了评论。他们谈论的是MyClass的不同版本,因为它们已经存在了很长一段时间。在我的回答中,我猜事实并非如此(您实际上是在代码运行期间重新序列化MyClass和反序列化,中间没有任何重新编译。如果不是(如果实际上您序列化了类,更改了它,并重新编译并尝试重新读取旧文件),那么akf的答案与Tom的注释是正确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1438733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档