使用不同的Java版本进行Java Map / List序列化/反序列化?

时间:2014-09-29 08:25:39

标签: java serialization

如果我使用java版本序列化Map(或List)会发生什么情况,并尝试使用其他java版本对其进行反序列化,其中serialVersionUID已更改?我想它会失败。

如果你为其他人创建一个lib来使用什么是序列化对象的首选方法,使用Java对象如Map,List或使用自制对象数组?

e.g。 List<MyObject>MyObject[]Map<String, MyObject>MyObject2[](MyObject2包含密钥和MyObject)?

2 个答案:

答案 0 :(得分:1)

是的,您是对的,更改serialVersionUID的反序列化将失败。 JDK的版本在这里无关紧要。

  

如果您为其他人创建了一个lib,则可以使用首选方式   使用Java对象(如Map,List或使用)来序列化对象   一系列自制物?

您可以将对象序列化为更可移植的格式,例如纯文本(例如JSON,XML)。您可以查看JAXBXStream

但请记住,序列化的主要用途是通过网络传输对象。如果您想存储某些状态,通常应该使用数据库。序列化到字节主要用于短期对象(因为正如您所注意到的,对象可能会发生变化,因此serializationVersionId也可能会发生变化)。

希望它有所帮助。

答案 1 :(得分:1)

如果您控制该类,并且如果您没有更改serialVersionUID,则也可以从旧版本反序列化类的实例。 java提供了一种称为二进制兼容性的概念。二进制兼容性的大部分灵活性来自于对类,接口,字段,方法的名称使用符号引用的后期绑定:

http://docs.oracle.com/javase/7/docs/platform/serialization/spec/version.html

来自java的核心类,例如即使该类将涉及未来版本的java,HashMap,ArrayList,Vector ...也将是可反序列化的。

如果您希望在自己的类中控制版本控制,只需手动提供serialVersionUID字段并确保它始终相同,无论您对类文件做了哪些更改。

另见本文: http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html