В чем разница между Serializable
и Externalizable
в Java?
В чем разница между Serializable
и Externalizable
в Java?
Чтобы добавить к другим ответам, реализуя java.io.Serializable
, вы получаете «автоматическую» возможность сериализации для объектов вашего класса. Не нужно реализовывать какую-либо другую логику, это просто сработает. Среда выполнения Java будет использовать отражение, чтобы выяснить, как маршалировать и демаршировать ваши объекты.
В более ранней версии Java отражение было очень медленным, и поэтому сериализация больших графов объектов (например, в клиент-серверных приложениях RMI) представляла собой небольшую проблему с производительностью. Чтобы справиться с этой ситуацией, java.io.Externalizable
был предоставлен интерфейс, который похож java.io.Serializable
на пользовательские механизмы для выполнения функций маршалинга и демаршаллинга (вам необходимо реализовать методы readExternal
и writeExternal
методы в вашем классе). Это дает вам возможность обойти узкое место производительности отражения.
В последних версиях Java (разумеется, начиная с версии 1.3) производительность отражения значительно выше, чем раньше, и поэтому это намного меньше проблем. Я подозреваю, что вам будет трудно получить значительную выгоду от Externalizable
современной JVM.
Кроме того, встроенный механизм сериализации Java не единственный, вы можете получить сторонние замены, такие как JBoss Serialization, который значительно быстрее и является заменой по умолчанию.
Большим недостатком Externalizable
является то, что вы должны поддерживать эту логику самостоятельно - если вы добавляете, удаляете или изменяете поле в своем классе, вы должны изменить свои writeExternal
/ readExternal
методы для его учета.
Таким образом, Externalizable
является пережитком Java 1.1 дней. Там действительно не нужно больше.
Externalizable
помогает .Externalizable
подходит мне гораздо лучше, так как я не хочу выводить массивы с пустыми пробелами или объектами-заполнителями, плюс с явным интерфейсом вы можете обрабатывать наследование, что означает мою синхронизированную подпрограмму -класс может легко добавить блокировку по всему вызовуwriteExternal()
. Так что да, Externalizable по-прежнему очень актуален, безусловно, для больших или сложных объектов.Сериализация обеспечивает функциональность по умолчанию для хранения и последующего воссоздания объекта. Он использует подробный формат для определения всего графа объектов, которые должны быть сохранены, например, предположим, что у вас есть связанный список и код, как показано ниже, тогда сериализация по умолчанию обнаружит все объекты, которые связаны, и сериализует. При сериализации по умолчанию объект создается полностью из его сохраненных битов, без вызовов конструктора.
Но если вы хотите ограниченную сериализацию или не хотите, чтобы часть вашего объекта сериализовалась, используйте Externalizable. Интерфейс Externalizable расширяет интерфейс Serializable и добавляет два метода, writeExternal () и readExternal (). Они автоматически вызываются при сериализации или десериализации. При работе с Externalizable мы должны помнить, что конструктор по умолчанию должен быть публичным, иначе код будет выдавать исключение. Пожалуйста, следуйте приведенному ниже коду:
Здесь, если вы прокомментируете конструктор по умолчанию, код выдаст ниже исключения:
Мы можем заметить, что, поскольку пароль является конфиденциальной информацией, я не сериализую его в методе writeExternal (ObjectOutput oo) и не устанавливаю его значение в readExternal (ObjectInput oi). Это гибкость, которую обеспечивает Externalizable.
Вывод вышеприведенного кода приведен ниже:
Мы можем наблюдать, как мы не устанавливаем значение passWord, поэтому оно равно нулю.
Этого также можно добиться, объявив поле пароля как переходное.
Надеюсь, поможет. Я прошу прощения, если я сделал какие-либо ошибки. Спасибо.
источник
Ключевые различия между
Serializable
иExternalizable
Serializable
является маркером интерфейс без каких - либо методов.Externalizable
Интерфейс содержит два метода:writeExternal()
иreadExternal()
.Serializable
интерфейс. Определенный программистом процесс сериализации будет запущен для классов, реализующихExternalizable
интерфейс.Externalizable
интерфейсом. Вы можете поддерживать разные версии вашего объекта. Если вы реализуетеExternalizable
, вы несете ответственность за сериализациюsuper
классаSerializable
использует отражение для конструирования объекта и не требует никакого arg-конструктора. НоExternalizable
требует публичного безошибочного конструктора.Обратитесь к блогу путем
Hitesh Garg
для получения более подробной информации.источник
Сериализация использует определенные поведения по умолчанию для хранения и последующего воссоздания объекта. Вы можете указать, в каком порядке или как обрабатывать ссылки и сложные структуры данных, но в конечном итоге все сводится к использованию поведения по умолчанию для каждого примитивного поля данных.
Экстернализация используется в тех редких случаях, когда вы действительно хотите хранить и перестраивать свой объект совершенно другим способом и без использования стандартных механизмов сериализации для полей данных. Например, представьте, что у вас есть собственная уникальная схема кодирования и сжатия.
источник
Сериализация объектов использует интерфейсы Serializable и Externalizable. Объект Java только сериализуем. если класс или любой из его суперклассов реализует либо интерфейс java.io.Serializable, либо его подынтерфейс, java.io.Externalizable. Большинство классов Java являются сериализуемыми .
NotSerializableException
:packageName.ClassName
«Для участия объекта Class в процессе сериализации, класс должен реализовывать интерфейс Serializable или Externalizable.Сериализуемый интерфейс
Сериализация объектов создает поток с информацией о классах Java для сохраняемых объектов. Для сериализуемых объектов хранится достаточно информации для восстановления этих объектов, даже если присутствует другая (но совместимая) версия реализации класса. Сериализуемый интерфейс определен для идентификации классов, которые реализуют сериализуемый протокол:
InvalidClassException
«В процессе десериализации, если значение локального класса serialVersionUID отличается от соответствующего класса отправителя. тогда результат в конфликте какjava.io.InvalidClassException: com.github.objects.User; local class incompatible: stream classdesc serialVersionUID = 5081877, local class serialVersionUID = 50818771
Внешний интерфейс
Для объектов Externalizable контейнер сохраняет только идентичность класса объекта; класс должен сохранить и восстановить содержимое. Интерфейс Externalizable определяется следующим образом:
OptionalDataException
«Поля должны быть в том же порядке и типе, как мы их выписали. Если есть какое-либо несоответствие типа из потока, он генерирует исключение OptionalDataException.Поля экземпляра класса, который написан (выставлен) для
ObjectOutput
сериализации.Пример « реализует Сериализуемый
Пример « реализует Externalizable
пример
@видеть
источник
Интерфейс Externalizable фактически не был предоставлен для оптимизации производительности процесса сериализации! но предоставить средства для реализации собственной обработки и предложить полный контроль над форматом и содержимым потока для объекта и его супертипов!
Примерами этого является реализация AMF (ActionScript Message Format) удаленного взаимодействия для передачи собственных объектов сценария действия по сети.
источник
https://docs.oracle.com/javase/8/docs/platform/serialization/spec/serialTOC.html
Сериализация по умолчанию несколько многословна и предполагает самый широкий возможный сценарий использования сериализованного объекта, и, соответственно, формат по умолчанию (Serializable) аннотирует результирующий поток информацией о классе сериализованного объекта.
Экстернализация дает производителю объектного потока полный контроль над точными метаданными класса (если таковые имеются) за пределами минимальной требуемой идентификации класса (например, его имени). Это явно желательно в определенных ситуациях, например, в закрытых средах, в которых сопоставляются производитель потока объекта и его потребитель (который получает объект из потока), а дополнительные метаданные о классе не служат цели и ухудшают производительность.
Кроме того (как указывает Ури), экстернализация также обеспечивает полный контроль над кодированием данных в потоке, соответствующем типам Java. Для (надуманного) примера вы можете записать логическое true как «Y» и false как «N». Экстернализация позволяет вам сделать это.
источник
При рассмотрении вариантов повышения производительности не забывайте настраиваемую сериализацию. Вы можете позволить Java делать то, что он делает хорошо, или, по крайней мере, достаточно хорошо, бесплатно , и предоставлять настраиваемую поддержку того, что он делает плохо. Обычно это намного меньше кода, чем полная поддержка Externalizable.
источник
Существует так много различий между Serializable и Externalizable, но когда мы сравниваем разницу между настраиваемыми Serializable (переопределенными writeObject () & readObject ()) и Externalizable, мы обнаруживаем, что пользовательская реализация тесно связана с классом ObjectOutputStream, где, как и в случае Externalizable, мы сами обеспечить реализацию ObjectOutput, который может быть классом ObjectOutputStream или другим, например org.apache.mina.filter.codec.serialization.ObjectSerializationOutputStream
В случае интерфейса Externalizable
Я добавил пример кода, чтобы объяснить лучше. пожалуйста, проверьте вход / выход объекта case Externalizable. Они не связаны с какой-либо реализацией напрямую.
Где, как Outtream / Instream тесно связаны с классами. Мы можем расширить ObjectOutputStream / ObjectInputStream, но его будет немного сложно использовать.
источник
По сути,
Serializable
это маркерный интерфейс, который подразумевает, что класс безопасен для сериализации, а JVM определяет, как он сериализуется.Externalizable
содержит 2 метода,readExternal
иwriteExternal
.Externalizable
позволяет разработчику решить, как сериализовать объект, гдеSerializable
сериализует объекты по умолчанию.источник
Некоторые отличия:
Для Сериализации не требуется конструктор по умолчанию для этого класса, потому что Object, потому что JVM создает то же самое с помощью Reflection API. В случае Externalization требуется конструктор без аргумента, потому что управление находится в руках программиста, а затем присваивает десериализованные данные объекту через сеттеры.
При сериализации, если пользователь хочет пропустить определенные свойства для сериализации, он должен пометить эти свойства как временные, и наоборот, для Externalization не требуется.
Если для любого класса ожидается поддержка обратной совместимости, рекомендуется использовать Externalizable. Сериализация поддерживает сохранение defaultObject, и если структура объекта нарушена, это вызовет проблемы при десериализации.
источник