我想将我的问题改为以下几点:
我有一个HashMap对象和一个int对象。我想将序列化到同一个文件中,然后返回。我知道我应该以与序列化相同的顺序进行反序列化。
请向我提供执行该操作的代码。
发布于 2009-09-17 13:03:22
基于您提供的信息,我做了一个假设,即由于最初序列化的类和具有新字段的更新类之间的不兼容性,您遇到了序列化问题。
如果您以前序列化了一个类,但没有指定private static long serialVersionUID,则添加新字段将导致在尝试读回文件时出现InvalidClassException。
请注意,在序列化以前的版本之后简单地添加serialVersionUID不会产生兼容的类。您需要做的是重新生成原始的serialVersionUID,获取该编号并将其应用于您的类。
您必须采取的步骤:
private static long serialVersionUID 完成这些步骤之后,您应该可以反序列化原始代码了。
发布于 2009-09-17 18:37:17
如果没有堆栈跟踪,很难猜测确切的问题,但我将冒险提出两种可能性:
运行时的hashmap不包含可序列化的对象。给定您所呈现的泛型类型,只有在使用原始类型的情况下才有可能实现。例如:
public void setMap(HashMap map) { this.map = map; }这会给你一个编译器警告,但它会编译,所以可能会发生类似的事情。如果地图上有一个getter,并且某些东西使用它的原始类型引用了地图,那么同样的事情也会发生。可以这样说:
public Map<String, String> getMap() { return map; }
Map m = getMap();
m.put(new Object(), new Object());我能想到的另一种可能性是,当你写或读文件时,你正在以某种方式损坏文件(比如,在你写它的时候做一些文件编码的事情,或者不关闭流)。
如果没有更多的信息(完整的堆栈跟踪-如果需要,可以删除引用您自己的项目名称的行,但没有其他行)和执行序列化和反序列化的代码,就不可能进一步深入了解问题。
顺便说一句,没有任何注释或答案认为您序列化了HashMap并想要反序列化MyClass (这实际上不可能--您无法决定反序列化时会得到什么类)。我认为你误解了评论。他们谈论的是MyClass的不同版本,因为它们已经存在了很长一段时间。在我的回答中,我猜事实并非如此(您实际上是在代码运行期间重新序列化MyClass和反序列化,中间没有任何重新编译。如果不是(如果实际上您序列化了类,更改了它,并重新编译并尝试重新读取旧文件),那么akf的答案与Tom的注释是正确的。
https://stackoverflow.com/questions/1438733
复制相似问题