2010-09-11 3 views
2

Мой друг спросил меня, если мы сериализуем объект в java 1.5, а затем десериализуем его обратно в java 1.6, тогда он выдает исключение. Что это за исключение и почему это брошено?Является ли сериализованный объект совместимым во всех версиях java?

Но я сомневаюсь, что не будет никаких исключений. Причина в том, что в определении класса ничего не меняется, поэтому он не должен сталкиваться с какой-либо проблемой при восстановлении объекта из сериализованной формы. Я прав? Если нет, то что и почему выбрано исключение?

Примечание: Класс остается нетронутым, а не поле, а не методы, а не serialVersionUID.

ответ

6

Формат сериализации имеет detailed specification, который изменяется только для размещения новых языковых функций (например, перечислений на Java 5), ​​и я уверен, что любые такие изменения тщательно выполняются с понижением.

Таким образом, если вы не сталкиваетесь с ошибкой (что, безусловно, возможно), или попытайтесь десериализовать что-то с версией Java, где некоторые функции еще не существуют, десериализация должна работать на разных версиях, поставщиках и платформах Java.

+0

Я хотел бы принять это. Но давайте посмотрим, получится ли еще ответ :) –

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 –

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

+0

Я думаю, что его часть Магического контента ... http://download.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html –