2012-03-11 2 views
4

Для класса, который реализует интерфейс Serializable есть 2 способа определить, какие конкретные поля получить потоковые во время сериализации:Сериализация - В чем преимущество использования ObjectStreamField [] serialPersistentFields?

  1. По умолчанию все не статическое, непреходящее поле, реализующие Serializable сохраняются.
  2. Определив ObjectStreamField [] serialPersistentFields и явно объявив определенные поля сохраненными.

Интересно, в чем преимущество второго метода, за исключением возможности определять порядок отдельных полей?

+0

А я не видел, что ответ был уже принят. Этот ответ правильный, но я не думаю, что он отвечает на ваш вопрос «почему». – orbfish

ответ

3

«Преимущество» заключается в том, что он выполняет то, что он говорит в Javadoc: определяет, какие поля сериализуются. Без него все нестационарные нестатические поля сериализуются. Твой выбор.

+0

Так почему бы просто не сделать их «временными»? – aviad

+0

@aviad, потому что он может сломать что-то еще, или вы можете использовать функцию «unshared», ... – EJP

+0

Перерыв что? readUnshared() только делает недействительным дескриптор strream, из которого пришел объект, - пожалуйста, уточните (я не могу распознать корреляцию) – aviad

1

Преимущество состоит в том, что вы можете условно заполнить ObjectStreamField во время выполнения, хотя только один раз на жизненный цикл JVM, чтобы определить, какие поля должны быть сериализованы.

private static final ObjectStreamField [] osf; 
static { 
    //code to init osf 
} 
+1

Не отвечает на вопрос. – EJP

3

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

  • Позволяет получать условный вывод (различные виды использования для сериализации, такие как сохранение и копирование, могут сериализовать различные части объекта).
  • Должно быть быстрее, используйте меньше памяти, а в некоторых случаях используйте меньше диска, чем механизм по умолчанию (это от от Блоха Эффективная Java 2).
  • Позволяет переименовывать переменные в сериализованном классе, сохраняя обратную совместимость.
  • Позволяет получать доступ к данным из удаленных полей в новой версии (другими словами, изменять внутреннее представление ваших данных при сохранении обратной совместимости).

Я видел документацию вы цитируете, и упоминая только те 2 варианта немного вводит в заблуждение и оставляет совсем немного из: вы можете настроить формат сериализации в 2 способами, с помощью ObjectOutput/InputStream интерфейс для записи и чтения полей в определенном порядке (описан в Блохе) и использование классов PutField и GetField для записи и чтения полей по имени. Вы можете использовать serialPersistentFields в качестве цитаты, чтобы продлить этот второй метод, но это не требуется, если вам не нужно читать или писать данные с именем, которое не является именем переменной-члена.

Существует 3-й способ управления форматом, используя интерфейс Externizable, хотя я так и не исследовал его. И некоторые из преимуществ можно также получить через прокси-серверы Serialization (см. Bloch).

Любой человек может поправить меня по деталям, если я пропустил что-либо.

0

В serialPersistentFields вы можете указать поля, которые необязательно присутствуют в классе.

См. Например, класс jdk java.math.BigInteger, где считываются и записываются несколько полей, которые больше не существуют в классе. Эти устаревшие поля по-прежнему читаются и записываются для совместимости со старыми версиями.Чтение и запись этих полей обрабатываются методами readObject() и writeObject().

Смотрите также http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serial-arch.html#6250

Смежные вопросы