从GZipped文件读取对象时出现ClassNotFoundException

时间:2016-10-31 18:19:25

标签: java serialization gzipinputstream

A * .gz文件是在我正在使用的包的先前版本下创建的(它具有类tratz.semantics.ClassificationBundle)。在当前版本中,该类名为miacp.semantics.ClassificationBundle。两人有相同的成员。有没有办法让更早版本的早期版本可读?基本的读取功能是

ClassificationBundle bundle = (ClassificationBundle) ois.readObject();

我有早期版本,所以我可以读取该版本中的文件。但是,我如何创建一个可以在新版本中读取的新文件?

3 个答案:

答案 0 :(得分:0)

Java二进制序列化对任何类型的重构都非常严厉。遗憾的是,tratz.semantics.ClassificationBundle永远无法反序列化为miacp.semantics.ClassificationBundle

JSON或XML序列化是解决此类问题的常见方法。或者,您可以创建自定义存储格式。或者您可以简单地存储原始/简单数据值,然后加载它们而不是加载自定义对象(int / long / double / String / ...等)。

答案 1 :(得分:0)

tratz.semantics.ClassificationBundle课程改为使用将创建新对象的readResolve()方法。当所有序列化内容以新格式(作为新类)反序列化时,您将能够删除此旧存根。

答案 2 :(得分:0)

我成功地遵循了 flakes 建议,将两个包放在类路径中。描述细节是有用的。使用 Netbeans ,我创建了另一个 tratz 的源路径,并添加了一个子文件夹并将原始ClassificationBundle类复制到该文件夹​​。 Netbeans 告诉我我需要导入的其他软件包,所以我也可以将这些软件包复制到相应的子文件夹中。然后我回到上面引用的原始代码来阅读对象。我继续为其他课程获得ClassNotFoundException。这导致需要复制其他类。最后,我复制了57个类,并且能够成功读取GZipped文件。下一步是编写实用程序来复制内容(更简单,但考虑到数据结构的复杂性,仍然有一些困难)。

由于