2010-09-11 33 views
2

我的朋友问我是否在java 1.5中序列化一个对象,然后在java 1.6中反序列化它,然后它会抛出一个异常。那是什么异常以及为什么会抛出?序列化对象在所有版本的java中是否兼容?

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

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

回答

6

序列化格式有一个detailed specification,它只是为了适应新的语言特性(比如Java 5中的枚举)而改变,我非常肯定任何这样的更改都是向下兼容的。

所以,除非遇到错误(这当然是可能的),或者尝试使用其中某些功能尚不存在的Java版本进行反序列化,否则反序列化应该适用于不同的Java版本,供应商和平台。

+0

我想接受此。但让我们看看是否得到另一个答案:) – 2010-09-11 09:20:02

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

我喜欢它;)+1 – 2010-09-11 13:45:47

0

序列化的对象具有类似于次要版本号和主要版本号的内容,它告诉关于该对象的兼容性。但是,序列化应该是向后兼容的。所以使用1.5序列化的对象应该可以使用1.6。

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

+0

我没有看到http://download.oracle.com/javase/6/docs/platform/serialization中的小版本和主版本号/spec/serialTOC.html。你在哪看到的? – emory 2010-09-11 10:00:32

+0

我认为它是魔术内容的一部分... http://download.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html – 2010-09-11 11:13:56