我的朋友问我是否在java 1.5中序列化一个对象,然后在java 1.6中反序列化它,然后它会抛出一个异常。那是什么异常以及为什么会抛出?序列化对象在所有版本的java中是否兼容?
但我怀疑会有任何异常。在类定义中原因没有改变,因此它不应该在从序列化表单重建对象时面临任何问题。我对吗?如果不是,那么为什么抛出异常?
注意:该类保持不变,没有任何字段,没有方法,也没有改变serialVersionUID。
我的朋友问我是否在java 1.5中序列化一个对象,然后在java 1.6中反序列化它,然后它会抛出一个异常。那是什么异常以及为什么会抛出?序列化对象在所有版本的java中是否兼容?
但我怀疑会有任何异常。在类定义中原因没有改变,因此它不应该在从序列化表单重建对象时面临任何问题。我对吗?如果不是,那么为什么抛出异常?
注意:该类保持不变,没有任何字段,没有方法,也没有改变serialVersionUID。
序列化格式有一个detailed specification,它只是为了适应新的语言特性(比如Java 5中的枚举)而改变,我非常肯定任何这样的更改都是向下兼容的。
所以,除非遇到错误(这当然是可能的),或者尝试使用其中某些功能尚不存在的Java版本进行反序列化,否则反序列化应该适用于不同的Java版本,供应商和平台。
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") ; }
}
}
我喜欢它;)+1 – 2010-09-11 13:45:47
序列化的对象具有类似于次要版本号和主要版本号的内容,它告诉关于该对象的兼容性。但是,序列化应该是向后兼容的。所以使用1.5序列化的对象应该可以使用1.6。
如果您尝试在1.4中加载相同的对象,您应该会看到与1.5中编译的类在1.4运行时中运行时引发的异常相同的异常。
我没有看到http://download.oracle.com/javase/6/docs/platform/serialization中的小版本和主版本号/spec/serialTOC.html。你在哪看到的? – emory 2010-09-11 10:00:32
我认为它是魔术内容的一部分... http://download.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html – 2010-09-11 11:13:56
我想接受此。但让我们看看是否得到另一个答案:) – 2010-09-11 09:20:02