我该如何为一组Java可序列化类更改包?

5

我想要更改应用程序中多个类的包。 一个好的Eclipse编辑器会很棒,但我的某些类是可序列化的,我需要支持跨版本兼容性。

有什么办法可以做到吗? 可以自动/半自动完成吗?

2个回答

4
如果类结构保持不变,您可以子类化自定义ObjectInputStream,在其构造函数中调用enableResolveObject(true),然后重写readClassDescriptor(),例如:
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
    ObjectStreamClass read = super.readClassDescriptor();
    if (read.getName().startsWith("com.old.package.")) {
        return ObjectStreamClass.lookup(Class.forName(read.getName().replace("com.old.package.", "org.new.package.")));
    }
    return read;
}

http://download.oracle.com/javase/6/docs/platform/serialization/spec/serialTOC.html - 这篇文章看起来有点晦涩,但我认为它是第一流的参考资料。Bloch的《Effective Java》也提供了一些提示,但没有深入讲解ObjectInputStream的细节。通过查看代码片段,我相信在这种情况下调用enableResolveObject(true)是不必要的。 - vanto
它对我不起作用。 - coretechie

0

如果你改变类的名称或包名,就会破坏序列化的兼容性。

你必须找到一种方法来保持你的类在同一个包中,否则你就必须打破向后兼容性。

如果你仍然在之前版本的应用程序上进行更新,你可以创建一个强制更新,改变数据序列化方式并且不使用默认的Java序列化。


同一主题:


1
是的 - 运行两个版本的类一段时间,并在应用程序启动时将旧版本转换为新版本。一旦这样做足够了,就可以改变代码。 - Erick Robertson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接