Который является лучшей альтернативой для Сериализации Java?

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

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

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

47
задан Jim Ferrans 8 August 2014 в 18:03
поделиться

8 ответов

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

  1. Явно определяют SerialUID.
  2. Определяют Вашу собственную сериализированную форму в соответствующих случаях.

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

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

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

<час>

После этих слов если Вы все еще рассматриваете подход несериализации, вот пара:

XML маршалинг

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

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

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

9
ответ дан Jim Ferrans 26 November 2019 в 19:29
поделиться

http://x-stream.github.io/ хорош, смотрите на него! Очень удобный

20
ответ дан facundofarias 26 November 2019 в 19:29
поделиться

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

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

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

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

14
ответ дан johnstok 26 November 2019 в 19:29
поделиться

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

Один из advanteages буферов протокола - то, что это может обмениваться информацией с C, C++, Python и Java.

9
ответ дан anjanb 26 November 2019 в 19:29
поделиться

Попытайтесь сериализировать к json с Gson, например.

5
ответ дан Benno Richters 26 November 2019 в 19:29
поделиться

Лично, я использую Известность много, так как она показывает совместимость с Smalltalk (и VW и Писк) и Python. (Правовая оговорка, я - основной участник проекта Известности.)

1
ответ дан akuhn 26 November 2019 в 19:29
поделиться

Возможно Castor?

1
ответ дан toolkit 26 November 2019 в 19:29
поделиться

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

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

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

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

1
ответ дан Kevin Day 26 November 2019 в 19:29
поделиться
Другие вопросы по тегам:

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