Java Serialization 1.4 vs 1.6

时间:2008-11-25 20:21:08

标签: java serialization

我有一个java程序必须编译为1.4,另一个程序可以是任何东西(所以,1.4或1.6),这两个需要来回传递序列化对象。如果我在两个程序都能看到它的地方定义一个可序列化的类,那么java的序列化是否仍然可行,或者我只需要1.6-1.6或1.4-1.4吗?

5 个答案:

答案 0 :(得分:5)

确保要序列化的类定义并为static final long serialVersionUID赋值,您应该没问题。

那就是说,通常我不会这样做。我的偏好是只在单个进程中使用普通序列化,或者在同一台机器上使用两个进程并从同一个jar文件中获取序列化类。如果不是这样,那么序列化为XML是更好,更安全的选择。

答案 1 :(得分:3)

serialVersionUID一起,包结构必须保持序列化的一致性,因此如果您在1.4中有myjar.mypackage.myclass,则必须在1.6中拥有myjar.mypackage.myclass

在包结构中的某个位置使用Java版本或发行版本并不罕见。即使serialVersionUID在编译之间保持不变,包结构也会导致在运行时抛出不兼容的版本异常。

顺便说一句,如果你在类中实现Serializable,那么如果serialVersionUID丢失,你应该收到编译器警告。

在我看来(并且基于多年的相当痛​​苦的经验)Java本地序列化充满了问题,如果可能的话应该避免,特别是因为有优秀的XML / JSON支持。如果你必须本地序列化,那么我建议你隐藏接口后面的类并在后台实现工厂模式,这将在需要时创建一个正确类的对象。

您还可以使用此抽象来检测不兼容的版本异常,并在幕后进行任何转换,以便在对象中迁移数据。

答案 2 :(得分:1)

除非另有说明,否则Java库类应具有介于1.4和1.6之间的兼容序列化形式。 Swing明确声明版本之间不兼容,所以如果你试图序列化Swing对象,那么你就不走运了。

您可能会遇到javac生成的代码略有不同的问题。这将更改serialVersionUID。您应确保在所有可序列化类中明确声明UID。

答案 3 :(得分:1)

不,不同版本的JVM不会破坏序列化本身。

如果您要序列化的某些对象来自Java运行时,并且它们的类不一致,那么您将看到失败。大多数核心Java类都对此很谨慎,但过去在某些软件包中存在不连续性。

我已成功使用序列化(在RMI的上下文中)与运行不同版本Java运行库的不同机器上的不同编译的类多年。

我不想离原始问题太离谱,但我想要注意,无论格式如何,进化序列化的类总是需要小心。它不是Java序列化特有的问题。无论是使用XML,JSON,ASN.1等进行序列化,都必须处理相同的概念.Java序列化可以非常清楚地说明允许的内容以及如何进行允许的更改。有时这是限制性的,有时候处方是有帮助的。

答案 4 :(得分:0)

如果双方使用相同的jar文件,它大部分时间都可以使用。但是,如果您使用相同软件包/模块/框架的不同版本(例如,不同的weblogic jar或某些“稀有”例外的扩展使用),则需要进行大量集成测试才能获得批准。