如果我使用java版本序列化Map(或List)会发生什么情况,并尝试使用其他java版本对其进行反序列化,其中serialVersionUID已更改?我想它会失败。
如果你为其他人创建一个lib来使用什么是序列化对象的首选方法,使用Java对象如Map,List或使用自制对象数组?
e.g。
List<MyObject>
或MyObject[]
?
Map<String, MyObject>
或MyObject2[]
(MyObject2包含密钥和MyObject)?
答案 0 :(得分:1)
是的,您是对的,更改serialVersionUID
的反序列化将失败。 JDK的版本在这里无关紧要。
如果您为其他人创建了一个lib,则可以使用首选方式 使用Java对象(如Map,List或使用)来序列化对象 一系列自制物?
您可以将对象序列化为更可移植的格式,例如纯文本(例如JSON,XML)。您可以查看JAXB或XStream。
但请记住,序列化的主要用途是通过网络传输对象。如果您想存储某些状态,通常应该使用数据库。序列化到字节主要用于短期对象(因为正如您所注意到的,对象可能会发生变化,因此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