不同Java版本的Java映射/列表序列化/反序列化?

不同Java版本的Java映射/列表序列化/反序列化?,java,serialization,Java,Serialization,如果我用java版本序列化一个映射(或列表),并尝试用其他java版本反序列化它(serialVersionUID发生了更改),会发生什么?我想它会失败的 如果您创建一个库供其他人使用,那么使用Java对象(如Map、List)或使用自制对象数组序列化对象的首选方法是什么 e、 g。 列表或MyObject[]? Map或MyObject2[](MyObject2包含键和MyObject)?是的,您是正确的,使用已更改的serialVersionId进行反序列化将失败。JDK的版本在这里并不重要

如果我用java版本序列化一个映射(或列表),并尝试用其他java版本反序列化它(serialVersionUID发生了更改),会发生什么?我想它会失败的

如果您创建一个库供其他人使用,那么使用Java对象(如Map、List)或使用自制对象数组序列化对象的首选方法是什么

e、 g。
列表
MyObject[]

Map
MyObject2[]
(MyObject2包含键和MyObject)?

是的,您是正确的,使用已更改的
serialVersionId进行反序列化将失败。JDK的版本在这里并不重要

如果您创建一个库供其他人使用,首选的方法是什么 使用Java对象(如映射、列表或 自制物品阵列

您可以将对象序列化为某种更可移植的格式,例如纯文本(例如JSON、XML)。你可以看一看或者

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


希望有帮助。

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

所以java的核心类,比如HashMap,ArrayList,Vector。。。即使该类将涉及java的未来版本,也将是反序列化的

如果希望在自己的类中控制版本控制,只需手动提供serialVersionUID字段并确保它始终相同,而不管对类文件做了什么更改

另见本文:

如果您编写了该类,则可以控制
serialVersionUID
字段。这不会因为人们使用不同的Java版本而改变。你把这些概念混淆在一起了吗?是的,我创建了MyObject类,为此我可以控制serialVersionUID,但是我不能控制List或Map的SerialVersionId,所以我想知道使用自定义对象而不是使用List或Map是否更好?因为JDK的Map实现的SerialVersionId在内存中没有改变,所以很难看到这个问题的实质。