Подтвердить что ты не робот

Что является лучшей альтернативой Java Serialization?

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

Мы не можем реализовать ORM, потому что мы не можем ограничить пользователей нашей библиотеки во время разработки.

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

Мы пробовали с классом XMLEncoder (преобразовываем объект в XML), но мы обнаружили, что существует недостаток функциональности (например, не поддерживает Enums).

Наконец, мы также попробовали JAXB, но это навязывает нашим пользователям аннотирование их классов.

Любая хорошая альтернатива?

4b9b3361

Ответ 1

Самое простое для вас - это использовать сериализацию, IMO, но больше вникайте в сериализованную форму классов (которую вы действительно должны делать в любом случае). Например:

  • Явно определить SerialUID.
  • Определите свою собственную сериализованную форму, если это необходимо.

Сериализованная форма является частью API класса, и тщательное мышление должно быть включено в ее дизайн.

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

http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683


С учетом сказанного, если вы все еще рассматриваете несериализационный подход, вот пара:

XML-сортировка

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

Преобразование в/из YAML

Это идея, с которой я играл, но мне очень понравился формат YAML (по крайней мере, как пользовательский формат toString()). Но на самом деле, единственное различие для вас в том, что вы должны сортировать YAML вместо XML. Единственное преимущество в том, что YAML немного читательнее, чем XML. Те же ограничения применяются.

Ответ 2

В 2011 году, и в проекте коммерческих веб-сервисов REST мы используем следующие сериализаторы, предлагающие клиентам различные типы носителей:

  • XStream (для XML, но не для JSON)
  • Jackson (для JSON)
  • Kryo (быстрый, компактный формат двоичной сериализации)
  • Smile (двоичный формат, который поставляется с Jackson 1.6 и более поздними версиями).
  • Сериализация объектов Java.

Недавно мы экспериментировали с другими сериализаторами:

  • SimpleXML кажется прочным, работает со скоростью 2x XStream, но для нашей ситуации требуется слишком большая конфигурация.
  • YamlBeans имел пару ошибок.
  • SnakeYAML имел незначительную ошибку, связанную с датами.

Jackson JSON, Kryo и Jackson Smile были значительно быстрее, чем старые старые сериализации Java Object, примерно от 3x до 4,5x. XStream находится на медленной стороне. Но на этот раз все это твердый выбор. Мы будем следить за другими тремя.

Ответ 3

http://x-stream.github.io/ приятно, пожалуйста, взгляните на него! Очень удобно

Ответ 4

в реализации которой мы не имеем никакого контроля

Решение не делает этого. Если вы не контролируете реализацию типа, его не следует сериализовать. Конец истории. Сериализация Java обеспечивает serialVersionUID специально для управления несовместимостью сериализации между различными версиями типа. Если вы не контролируете реализацию, вы не можете быть уверены, что идентификаторы меняются правильно, когда разработчик меняет класс.

Возьмем простой пример "Точки". Он может быть представлен либо декартовой, либо полярной системой координат. Было бы дорого стоить для вас создание системы, которая могла бы динамически справляться с подобными исправлениями - она ​​действительно должна быть разработчиком класса, который проектирует сериализацию.

Короче, это ваш дизайн, который неправильный - не технология.

Ответ 5

Google придумал двоичный протокол - http://code.google.com/apis/protocolbuffers/ быстрее, имеет меньшую полезную нагрузку по сравнению с XML - что другие предложили как альтернативный.

Одним из преимуществ протокольных буферов является то, что он может обмениваться информацией с C, С++, python и java.

Ответ 6

Попробуйте выполнить сериализацию для json с помощью Gson.

Ответ 8

Если для вас важна скорость сериализации, то здесь есть всеобъемлющий эталон сериализаторов JVM:

Ответ 9

Возможно Castor?

Ответ 10

Лично я часто использую Fame, так как он обладает интероперабельностью с Smalltalk (как VW, так и Squeak) и Python. (Отказ от ответственности, я являюсь основным участником проекта Fame.)

Ответ 11

Betwixt - хорошая библиотека для сериализации объектов - но это не будет автоматическим видом вещей. Если количество объектов, которые вы должны сериализовать, относительно фиксировано, это может быть хорошим вариантом для вас, но если ваш "клиент" будет постоянно бросать вам новые классы, это может быть больше усилий, чем это стоит ( Определенно проще, чем XMLEncoder для всех особых случаев, хотя).

Другой подход заключается в том, чтобы потребовать от вашего клиента предоставления соответствующих файлов .betwixt для любых объектов, которые они бросают на вас (что эффективно разгружает ответственность перед ними). ​​

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

Если требование действительно так сложно, как вы описываете, вам может потребоваться какое-то BCE (модификация байтового кода) для объектов/аспектов/независимо. Это выходит далеко за рамки небольшого проекта развития, и в сферу Hibernate, Casper или ORM....

Ответ 12

Другая идея: используйте кеш. Кэши обеспечивают гораздо лучший контроль, масштабируемость и надежность приложения. Тем не менее, все-таки нужно сериализовать, но управление становится намного проще в рамках структуры кэширования. Кэш может сохраняться в памяти, диске, базе данных или массиве - или все варианты - с одним переполнением, ожиданиями, сбоем для другого. Commons JCS и Ehcache - это две реализации Java, последняя - это корпоративное решение, свободное от хранения до 32 ГБ (отказ от ответственности: я не работаю для ehcache;-)).