我有一个Java程序需要编译为1.4版本,另一个程序可以是任何版本(1.4或1.6),两个程序需要相互传递序列化对象。如果我在两个程序都能访问的地方定义一个可序列化类,Java的序列化是否仍然有效,还是只能使用1.6-1.6或1.4-1.4?
我有一个Java程序需要编译为1.4版本,另一个程序可以是任何版本(1.4或1.6),两个程序需要相互传递序列化对象。如果我在两个程序都能访问的地方定义一个可序列化类,Java的序列化是否仍然有效,还是只能使用1.6-1.6或1.4-1.4?
确保要序列化的类定义并分配一个值给static final long serialVersionUID
,你就可以了。
话虽如此,通常我不会这样做。我的偏好是仅在单个进程内或在两个进程之间使用普通序列化,并且这些进程位于同一台机器上并从同一JAR文件中获取序列化类。如果不是这种情况,序列化为XML是更好、更安全的选择。
serialVersionUID
,包结构在序列化时也必须保持一致。因此,如果你在1.4中有myjar.mypackage.myclass
,那么在1.6中也必须是myjar.mypackage.myclass
。serialVersionUID
保持不变,包结构也会导致不兼容版本异常在运行时被抛出。Serializable
,并且缺少serialVersionUID
,你应该会收到编译器警告。Java库类在1.4和1.6之间的序列化形式应该是兼容的,除非另有说明。Swing明确声明它在版本之间不兼容,因此如果您尝试序列化Swing对象,则会遇到问题。
您可能会遇到由javac生成的代码略有不同的问题。这将更改serialVersionUID
。您应该确保在所有可序列化的类中显式声明UID。
不,JVM的不同版本不会破坏序列化本身。
如果您要序列化的某些对象来自Java运行时,并且它们的类发生了不兼容的演变,那么您将会看到失败。大多数核心Java类都非常小心谨慎,但过去某些包中存在不连续性。
我已经成功地使用序列化(在RMI的上下文中)多年,其中包括来自不同编译和不同版本的Java运行时的类。
我不想偏离原始问题太远,但我想指出,无论格式如何,演变序列化类总是需要注意。这不是Java序列化特有的问题。无论您是在XML、JSON、ASN.1等中进行序列化,都必须处理相同的概念。Java序列化提供了一个相当清晰的规范,说明了允许的内容以及如何进行允许的更改。有时这是限制性的,有时有处方是很有帮助的。
如果双方使用相同的jar文件,大多数情况下它会正常工作。但是,如果您使用不同版本的同一软件包/模块/框架(例如不同的weblogic jars或某些“罕见”异常的扩展用法),则需要进行大量的集成测试,然后才能获得批准。