Сериализация: Basi c понимание и документация - PullRequest
0 голосов
/ 07 мая 2020

Внутри потока первая ссылка на любой объект приводит к сериализации или экстернализации объекта и присвоению дескриптора для этого объекта . Последующие ссылки на этот объект кодируются как дескрипторы. Использование дескрипторов объектов сохраняет совместное использование и циклические ссылки, которые естественным образом встречаются в графах объектов. Последующие ссылки на объект используют только дескриптор, обеспечивающий очень компактное представление.

За исключением сериализуемых полей, примитивные данные записываются в поток в записях блочных данных , с каждой записью с префиксом маркера и указанием количества байтов в записи.

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

Сериализация полезна, когда мы хотите:

  • Сохранять состояние вне жизненного цикла JVM - file / db
  • Отправлять данные в другое приложение на основе jvm по сети - обмен данными

До c: https://docs.oracle.com/javase/6/docs/platform/serialization/spec/serial-arch.html

Я работал с Spring / Hibernate, и ни в одном из приложений модели не определены как тип Serializable. Основная причина использования Serializable - это контроль версий для будущего улучшения, но без Serializable Hibernate сохраняет данные в БД, но сериализация в файл с использованием ObjectOutputStream не выполняется. Может ли кто-нибудь помочь мне понять это, почему Hibernate не требует, чтобы сущности были типа Serializable?

1 Ответ

1 голос
/ 07 мая 2020

Насколько я понимаю. Для №1 Поток объекта после сериализации состоит в основном из 5 частей:

  • Заголовок для утверждения, что это сериализованный файл и версия сериализации.
  • Информация о классе, такая как имя, идентификатор сериализации (serialVersionUID), количество полей и т. Д. c.
  • Описание полей
  • Информация о родительском классе
  • Значение полей.

Проверьте эти коды из ObjectOutputStream:

if (obj instanceof String) {
    writeString((String) obj, unshared);
} else if (cl.isArray()) {
    writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
    writeEnum((Enum<?>) obj, desc, unshared);
} else if (obj instanceof Serializable) {
    writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
    throw new NotSerializableException(
    cl.getName() + "\n" + debugInfoStack.toString());
} else {
    throw new NotSerializableException(cl.getName());
}

Для # 2 я думаю, что hibernate / jpa просто записывает их в базу данных по запросам, они не нужны для сериализации объекта. Вы можете внедрить объект с помощью Serializable, если вам нужно передать, а затем перекрестные JVM или другое использование (я думаю, вам лучше иметь сериализацию в веб-приложении).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...