我知道为什么我们需要提供一个串行UID(以便在反序列化期间,发送方和接收方具有相同的加载类)。因此,据此,如果我有多个具有相似UID的类,那么我是否会假设会发生反序列化,但之后会出错(我不知道是什么),这是正确的吗?还是它会以某种方式抛出InvalidClassException?还是我两种假设都完全脱离了?
我想测试一下,但是再次不确定是否可以工作,因为如果在反序列化过程中正确选择了正确的类怎么办?在这种情况下,一切都会变桃红色。
一点都不。通过反序列化重新创建实例时,反序列化程序将加载其类。然后,将该类的串行UID与反序列化实例的UID(即序列化时该类的UID)进行比较。仅当这两个UID不匹配时,InvalidClassException
才会引发an 。
例如,如果您将实例序列化为文件,停止JVM,使用该实例类的UID更改后的UID重新编译程序,重新启动应用程序并从以前的文件反序列化此实例,则会发生这种情况。UID旨在向应用程序发出信号,指出对该类应用了不兼容的更改。
如果两个具有不同全限定名的类具有相同的UID,则这根本不会影响您的(反序列化)。供您参考,这是Java文档描述此问题的方式:
序列化运行时与每个可序列化的类关联一个版本号,称为
serialVersionUID
,在反序列化期间使用该版本号来验证序列化对象的发送者和接收者是否已加载了该对象的与序列化兼容的类。如果接收者为对象加载的类
serialVersionUID
与相应的发送者的类不同,则反序列化将导致InvalidClassException
。可序列化类可以声明其自身
serialVersionUID
通过声明名为领域明确serialVersionUID
了必须是static
,final
和类型long
。
正如您在另一条评论中所问的那样,为什么该serialVersionUID
字段的类型long
可能会更小。当您未显式设置aserialVersionUID
而是由序列化程序隐式推断a时,这可能是为了避免冲突。在这种情况下,JVM会散列一个ID,该ID可能会与较小范围内的其他哈希值轻易冲突,例如byte
。如果您仅为每次手动更改手动增加此数字,则当然不可能耗尽的范围long
。通常,long
当您考虑这些天的内存价格时,单个值也不会太昂贵。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句