序列化对象是否兼容所有版本的java?

时间:2010-09-11 09:03:00

标签: java serialization version

我的朋友问我是否在java 1.5中序列化一个对象,然后在java 1.6中反序列化它然后会抛出异常。什么是异常以及抛出的原因?

但我怀疑会有任何例外。在类定义中没有改变原因,因此在从序列化表单重建对象时不应该遇到任何问题。我对吗?如果没有,那么抛出异常的原因和原因是什么?

注意:该类保持不变,不是任何字段,不是方法,也不是更改serialVersionUID。

3 个答案:

答案 0 :(得分:6)

序列化格式有一个detailed specification,只是为了适应新的语言功能(例如Java 5中的枚举),我很确定任何这些更改都是向下兼容的。

因此,除非您遇到错误(当然可能)或尝试使用尚未存在某些功能的Java版本反序列化某些内容,否则反序列化应该适用于不同的Java版本,供应商和平台。

答案 1 :(得分:2)

Michael's answer大多是正确的。但是有一些(公认的做作)案例,其中序列化版本不能向前兼容。

我怀疑没有writeObject,readObject,readObjectNoData方法的类之间会出现任何向前兼容性问题。我怀疑那些人中有任何非人为的案例。

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" ) ; }
       }
}

答案 2 :(得分:0)

序列化对象具有次要版本号和主要版本号,它们讲述了该对象的兼容性。但是,序列化应该向后兼容。因此,使用1.5序列化的对象应该与1.6一起使用。

如果尝试在1.4中加载同一个对象,则应该看到与在1.5运行时在1.4运行时运行的类抛出的异常相同的异常。