小编Nil*_*ile的帖子

跨越不同JVM的Java标准库中的SerialVersionUID

基于SerialVersionUID的描述:https://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html#a4100 ,似乎必须始终在您创建的任何类中包含SerialVersionUID,以便用于序列化的JVM和用于反序列化的不同JVM不会自动分配它们自己的SerialVersionUID,由于JVM的不同,它们可能彼此不同.这适用于控制我自己的类的反序列化,但是如果我想确保JVM B序列化的标准库中的类可以被JVM B反序列化呢?

Map<Integer, String> myMap = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

HashMap定义了一个SerialVersionUID.但:

  • 由于HashMap存在于java标准库中,我是否提供了任何保证,如果我使用JVM A序列化此HashMap,JVM B将能够对其进行反序列化?也就是说,JVM B是否允许指定与JVM A不同的SerialVersionUID,至少如果B只是A的次要版本升级?
  • 如果不能保证标准库类,那么使用SerialVersionUID是否真的只能确保您自己的类从未触及java标准库的正确反序列化?例如,一个看起来像这样的类:

    public class NewClass implements Serializable
    {
        private static final long serialVersionUID = 1L;
    
        private final Map<Integer, String> myMap;
    
        public NewClass()
        {
            this.myMap = new HashMap<>();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    因为反序列化依赖于具有相同SerialVersionUID的HashMap,这在不同的JVM中可能会有所不同,对吧?

java serialization serialversionuid

8
推荐指数
1
解决办法
110
查看次数

标签 统计

java ×1

serialization ×1

serialversionuid ×1