Платформа сериализации (без конструктора без аргументов) - PullRequest
2 голосов
/ 07 января 2011

Я ищу информацию о лучшем подходе сериализации графа объекта на основе следующего (Java):

  • Два объекта одного и того же класса должны быть двоично равны) по сравнению с истиной, если их состояние равно.(Не должно зависеть от упорядочения полей JVM).
  • Коллекции моделируются только с помощью массивов (ничего не коллекций).
  • Все экземпляры являются неизменяемыми
  • Формат сериализации должен быть в формате байта [], а не на основе текста.
  • Я управляю всеми классами в графе.

Я не хочу помещать пустой конструктор в классы только для поддержки сериализации.Я смотрел на реализацию решения, основанного на моем собственном обходе на Objenisis, но моя проблема не кажется такой уникальной.Лучше сначала проверить наличие любого существующего / полного решения.

Обновленные сведения:

Во-первых, спасибо за вашу помощь!

  • Объекты должны сериализоватьсяв точно такой же порядок бит в зависимости от состояния объектов.Это важно, поскольку двоичный контент будет иметь цифровую подпись.Реконструкция сериализованного формата будет основываться на состоянии объекта, а не на том, что исходные биты сохраняются.
  • Важна совместимость между различными технологиями.Я вижу, что программное обеспечение работает на экс..Net в будущем.Нет Java-аромата в сериализованном формате.

Примечание к комментариям неизменности: значения массивов копируются из аргумента во внутренние поля конструктора.Менее важно.

С уважением,

Никлас Линдберг

Ответы [ 5 ]

2 голосов
/ 07 января 2011

Вы можете написать данные самостоятельно, используя отражения или методы, закодированные вручную.Я использую методы, которые выглядят как код, за исключением того, что они генерируются.(Производительность написана вручную, и нет необходимости переписывать код при его изменении)

Часто разработчики говорят о встроенной java-сериализации, но вы можете иметь собственную сериализацию, чтобы делать все, что вы захотите, любойтак, как вы хотите.

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

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

0 голосов
/ 14 сентября 2011

Единственный способ получить это: текст A / USE UTF8, IE XML или JSON, двоичный код, преобразованный в base64 (безопасный вариант http / xml).B / Enforce UTF8 двоичное упорядочение всех данных.C / Упаковать содержимое, за исключением всего свободного пространства.D / Хешируйте содержимое и предоставьте этот хэш в стандартном месте в файле.

0 голосов
/ 09 января 2011

Может быть, вы хотите ознакомиться с платформами сериализации, доступными для Java. Хорошей отправной точкой для этого является проект thift-protobuf-compare , название которого вводит в заблуждение: он сравнивает производительность более 10 способов сериализации данных с использованием Java.

Кажется, что самое сложное ограничение - Interoperability between different technologies. Я знаю, что Googles Protobuffers и Thrift доставляют сюда. Авро тоже подойдет.

0 голосов
/ 07 января 2011

Является ли интерфейс Externalizable тем, что вы ищете? Вы полностью контролируете, как ваши объекты сохраняются, и вы делаете это в стиле OO, с методами, которые наследуются и все (в отличие от частных методов чтения / записи-объекта, используемых с Serializable). Но все же вы не можете избавиться от требования доступного конструктора без аргументов.

0 голосов
/ 07 января 2011

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

Используется для отправки классов из одной JVM в другую во время RMI или другого сетевого протокола. Это типы приложений, для которых вы должны использовать сериализацию. Если это описывает вашу проблему - кратковременную связь между двумя разными JVM - тогда вам следует попытаться запустить сериализацию.

Если вы ищете способ более постоянного хранения данных или вам понадобятся данные для выживания в передовых версиях Java, вам следует найти собственное решение. Учитывая ваши требования, вы должны создать какой-то метод преобразования каждого объекта в поток байтов самостоятельно и чтения его обратно в объекты. Затем вы будете нести ответственность за совместимость формата с будущими объектами и функциями.

Я настоятельно рекомендую главу 11 Эффективная Java Джошуа Блоха.

...