Как сериализация Java работает и когда она должна использоваться вместо некоторого другого метода персистентности?

39
задан Esko 2 May 2014 в 14:38
поделиться

8 ответов

Я лично старался бы избегать "встроенной" сериализации Java:

  • Это не портативно на другие платформы
  • , Это не чрезвычайно эффективно
  • , Это хрупко - получение, это для преодоления нескольких версий класса несколько хитро. Даже изменение компиляторов может повредить сериализацию, если Вы не осторожны.

для деталей того, что означают фактические байты, посмотрите Спецификация .

Сериализации объекта Java, Там различные альтернативы, такие как:

(Правовая оговорка: Я работаю на Google, и я делаю порт Буферов Протокола к C# как мой 20%-й проект, так ясно я думаю, что это - хороший бит технологии:)

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

В основном, необходимо посмотреть требования тщательно.

47
ответ дан Jon Skeet 27 November 2019 в 02:40
поделиться

Основное преимущество сериализации состоит в том, что это чрезвычайно просто в использовании, относительно быстро, и сохраняет фактические сетки объекта Java.

, Но необходимо понять, что это действительно не предназначено, чтобы использоваться для того, чтобы хранить данные, но главным образом как путь к различным экземплярам JVM для передачи по сети с помощью протокола RMI.

8
ответ дан Michael Borgwardt 27 November 2019 в 02:40
поделиться

посмотрите Объект Java Потоковый Протокол Сериализации для описания формата файла грамматика, используемая для сериализованных объектов.

Лично я думаю, что встроенная сериализация приемлема для сохранения недолгих данных (например, сохранить состояние объекта сессии между к запросам HTTP), который не релевантен вне приложения.

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

5
ответ дан Argelbargel 27 November 2019 в 02:40
поделиться

Я врезался в эту дилемму приблизительно месяц назад (см. вопрос, который я задал ).

основной урок я извлек уроки из него, сериализация Java использования только когда необходимый и если нет никакой другой опции. Как сказанный Jon, это имеет, это - крушения, в то время как другие методы сериализации являются намного легче, быстрее и более портативными.

0
ответ дан Community 27 November 2019 в 02:40
поделиться

Сериализация означает помещение структурированных данных в классы в плоский порядок байт-кода сохранить ее.

необходимо обычно использовать другие методы, чем метод Java здания, это просто сделано работать из поля, но если у Вас есть некоторое изменяющееся содержание или изменяющиеся заказы в будущем в Ваших сериализированных классах, Вы попадаете в беду, потому что Вы будете, не может загрузить их правильно.

0
ответ дан berlindev 27 November 2019 в 02:40
поделиться

Преимущество Сериализации объекта Java (JOS) состоит в том, что она просто работает. Существуют также инструменты там, которые делают то же как JOS, но используют формат XML вместо двоичного формата.

О длине: JOS пишет некоторую информацию о классе в запуске, вместо как часть каждого экземпляра - например, полные имена полей зарегистрированы однажды, и индекс в тот список имен используется для экземпляров класса. Это делает вывод дольше, если Вы только для записи один экземпляр класса, но более эффективно, если Вы пишете несколько (различных) экземпляров его. Мне не ясно, если Ваш пример на самом деле использует класс, но это - общая причина, почему JOS более длинен, чем можно было бы ожидать.

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

0
ответ дан 27 November 2019 в 02:40
поделиться

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

важные профессионалы: относительно простой в использовании, довольно быстро и может развиться (точно так же, как XML). Однако данные довольно непрозрачны, это только для Java, сильно связывает данные к классам, и недоверяемые данные могут легко вызвать DoS. Необходимо думать о сериализированной форме, вместо того, чтобы просто хлопнуть implements Serializable везде.

0
ответ дан Tom Hawtin - tackline 27 November 2019 в 02:40
поделиться

Если у вас не слишком много данных, вы можете сохранить объекты в объект java.util.Properties. Пример пары ключ / значение: user_1234_firstname = Peter. Использование отражения для сохранения и загрузки объектов может упростить задачу.

0
ответ дан 27 November 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: