我的朋友问我是否在java 1.5中序列化一个对象,然后在java 1.6中反序列化它然后会抛出异常。什么是异常以及抛出的原因?
但我怀疑会有任何例外。在类定义中没有改变原因,因此在从序列化表单重建对象时不应该遇到任何问题。我对吗?如果没有,那么抛出异常的原因和原因是什么?
注意:该类保持不变,不是任何字段,不是方法,也不是更改serialVersionUID。
答案 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运行时运行的类抛出的异常相同的异常。