Сериализация - в чем преимущество использования ObjectStreamField [] serialPersistentFields?



Для класса, реализующего интерфейс Serializable, существует 2 способа определить, какие конкретные поля передаются потоком во время сериализации:




  1. по умолчанию сохраняются все нестатические, непереходные поля, реализующие Serializable.

  2. путем определения ObjectStreamField [] serialPersistentFields и явного объявления конкретных сохраненных полей.


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

473   4  

4 ответов:

"преимущество" заключается в том, что он делает то, что он говорит в Javadoc: определяет, какие поля сериализуются. Без него все нестационарные нестатические поля сериализуются. Ваш выбор.

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.