代码之家  ›  专栏  ›  技术社区  ›  Rakesh Juyal

序列化对象在所有java版本中都兼容吗?

  •  2
  • Rakesh Juyal  · 技术社区  · 14 年前

    我的朋友问我,如果我们在Java1.5中序列化一个对象,然后在Java1.6中反序列化它,那么它会抛出一个异常。那个异常是什么?为什么抛出它?

    注: 该类保持不变,没有任何字段、方法和serialVersionUID被更改。

    3 回复  |  直到 14 年前
        1
  •  7
  •   Michael Borgwardt    14 年前

    序列化格式具有 detailed specification ,这只是为了适应新的语言特性(比如Java5中的枚举)而进行的更改,我很确定任何这样的更改都是经过仔细修改的。

        2
  •  2
  •   Community CDub    8 年前

    Michael's answer 基本上是正确的。但也有一些序列化版本不能向前兼容的情况(当然是人为的)。

    我怀疑在没有writeObject、readObject和readObjectNodeData方法的类之间是否存在任何前向兼容性问题。我怀疑在那些人当中是否有任何非人为的情况。

    class Anti6 implements Serializable
    {
           private void writeObject(java.io.ObjectOutputStream out)
           throws IOException { }
    
           private void readObject(java.io.ObjectInputStream in)
           throws IOException, ClassNotFoundException
           {
                 readObjectNoData ( ) ;
           }
    
           private void readObjectNoData()
           throws ObjectStreamException
           {
                 if ( System . getProperty ( "java.version" ) . equals ( "1.6" ) )
                 { throw new RuntimeException ( "I Hate 1.6" ) ; }
           }
    }
    
        3
  •  0
  •   Dhana Krishnasamy    14 年前

    序列化对象有一些类似于次要版本号和主要版本号的内容,这说明了该对象的兼容性。但是,序列化应该是向后兼容的。所以用1.5序列化的对象应该用1.6。

    如果您尝试在1.4中加载相同的对象,则应该看到与在1.4运行时运行在1.5中编译的类时引发的异常相同的异常。

    推荐文章