0

*.gz 文件是在我正在使用的包的先前版本下创建的(它具有类 tratz.semantics.ClassificationBundle)。在当前版本中,该类被命名为 miacp.semantics.ClassificationBundle。两者的成员相同。有什么方法可以让早期版本在后期版本中可读吗?基本的读取功能是

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

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

4

3 回答 3

0

Java 二进制序列化对任何类型的重构都非常不利。不幸的是,tratz.semantics.ClassificationBundle永远不能反序列化为miacp.semantics.ClassificationBundle.

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

于 2016-10-31T18:26:03.433 回答
0

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

于 2016-10-31T18:29:09.190 回答
0

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

谢谢

于 2016-11-01T01:52:59.000 回答