Какая лучшая альтернатива сериализации Java?

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

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

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

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

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

Есть хорошая альтернатива?

52
1

  • http://www.db4o.com? объектно-ориентированная база данных с открытым ис ...
11
Общее количество ответов: 11

Ответ #1

Ответ на вопрос: Какая лучшая альтернатива сериализации Java?

Сейчас 2011 год, и в проекте веб-сервисов 9X_jre REST коммерческого уровня мы используем 9X_java следующие сериализаторы, чтобы предложить 9X_serialized клиентам различные типы мультимедиа:

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

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

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

Jackson 9X_java JSON, Kryo и Jackson Smile были значительно 9X_jre быстрее, чем старая добрая сериализация 9X_serialize объектов Java, примерно в 3–4,5 раза. XStream 9X_deserialize работает медленно. Но на данный момент все 9X_jdk это хороший выбор. Мы продолжим следить 9X_j2se за остальными тремя.

45
2

  • Очень хороший набор сериализаторов. Единственное, что я могу упомянуть, это protostuff. Также: у Джексона теперь есть модуль XML (https://github.com/FasterXML/jackson-dataformat-xml), который достаточно хо ...

Ответ #2

Ответ на вопрос: Какая лучшая альтернатива сериализации Java?

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

20
0

Ответ #3

Ответ на вопрос: Какая лучшая альтернатива сериализации Java?

какую реализацию мы не контролируем

Решение - не делайте этого. Если у вас нет контроля над 9X_.java реализацией типа, вам не следует его сериализовать. Конец 9X_.java истории. Сериализация Java предоставляет 9X_.java serialVersionUID специально для управления 9X_serialized несовместимостью сериализации между различными 9X_jre версиями типа. Если вы не контролируете 9X_serialization реализацию, вы не можете быть уверены, что 9X_xml-serialization идентификаторы меняются правильно, когда 9X_serializing разработчик меняет класс.

Рассмотрим простой 9X_serialized пример "точки". Он может быть представлен 9X_jre в декартовой или полярной системе координат. Для 9X_serialization вас было бы непомерно дорого построить систему, которая 9X_serialize могла бы динамически справляться с такого 9X_serialisation рода исправлениями - на самом деле это должен 9X_serialize быть разработчик класса, который проектирует 9X_openjdk сериализацию.

Короче говоря, неправильный 9X_.java дизайн, а не технология.

16
0

Ответ #4

Ответ на вопрос: Какая лучшая альтернатива сериализации Java?

Проще всего вам по-прежнему использовать 9X_serialisation сериализацию, IMO, но больше подумать о 9X_.java сериализованной форме классов (что вам действительно 9X_serialized следует делать в любом случае). Например:

  1. Явно определите SerialUID.
  2. При необходимости определите собственную сериализованную форму.

Сериализованная 9X_javax форма является частью API класса, и ее дизайн 9X_serializing следует тщательно продумать.

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

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


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

Маршаллинг XML

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

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

Я 9X_.java долго раздумывал над этой идеей, но мне 9X_j2se очень понравился формат YAML (по крайней 9X_serializing мере, как пользовательский формат toString()). Но 9X_serializing на самом деле единственная разница для вас 9X_openjdk заключается в том, что вы будете выполнять 9X_j2se маршалинг в YAML вместо XML. Единственное 9X_oraclejdk преимущество состоит в том, что YAML немного 9X_serialized более удобочитаем, чем XML. Действуют те 9X_jre же ограничения.

13
0

Ответ #5

Ответ на вопрос: Какая лучшая альтернатива сериализации Java?

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

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

11
0

Ответ #6

Ответ на вопрос: Какая лучшая альтернатива сериализации Java?

Попробуйте сериализовать в json, например, с 9X_deserialize помощью Gson.

5
0

Ответ #7

Ответ на вопрос: Какая лучшая альтернатива сериализации Java?

Также очень быстрая замена сериализации 9X_serializing JDK: http://ruedigermoeller.github.io/fast-serialization/

5
0

Ответ #8

Ответ на вопрос: Какая лучшая альтернатива сериализации Java?

Если для вас важна скорость сериализации, то 9X_oraclejdk здесь можно найти исчерпывающий тест сериализаторов 9X_serialized JVM:

  • https://github.com/eishay/jvm-serializers/wiki

4
0

Ответ #9

Ответ на вопрос: Какая лучшая альтернатива сериализации Java?

Возможно, Castor?

9X_deserialize

1
0

Ответ #10

Ответ на вопрос: Какая лучшая альтернатива сериализации Java?

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

1
0

Ответ #11

Ответ на вопрос: Какая лучшая альтернатива сериализации Java?

Betwixt - хорошая библиотека для сериализации объектов, но 9X_serialisation она не будет автоматической. Если количество 9X_j2se объектов, которые вам нужно сериализовать, относительно 9X_serialisation фиксировано, это может быть для вас хорошим 9X_deserialize вариантом, но если ваш «клиент» будет постоянно 9X_xml-serialization бросать вам новые классы, это может потребовать 9X_serializing больше усилий, чем оно того стоит ( Однако 9X_serialized определенно проще, чем XMLEncoder для всех 9X_javax особых случаев).

Другой подход - потребовать 9X_.java от клиента предоставить соответствующие 9X_serialisation файлы .betwixt для любых объектов, которые 9X_jre они вам бросают (что фактически снимает 9X_serializing с них ответственность).

Кратко и кратко - сериализация 9X_serializing - это сложно - к ней не существует полностью мертвого 9X_openjdk подхода. Сериализация Java - это настолько 9X_.java близкое к мертвому мозгу решение, которое 9X_j2se я когда-либо видел, но, как вы обнаружили, неправильное 9X_java использование значения uid версии может 9X_jre его нарушить. Сериализация Java также требует 9X_xml-serialization использования интерфейса «Serializable» маркера, поэтому, если 9X_java вы не можете управлять своим источником, вам 9X_serialization не повезло с этим.

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

1
0