2008-11-25 2 views
4

У меня есть одна java-программа, которая должна быть скомпилирована как 1.4, и другая программа, которая может быть чем угодно (так, 1.4 или 1.6), а две должны передавать сериализованные объекты взад и вперед. Если я определяю сериализуемый класс в месте, где обе программы могут его видеть, будет ли сериализация Java по-прежнему работать, или мне нужно только 1.6-1.6 или 1.4-1.4?Java Serialization 1.4 vs 1.6

+0

Я единственный, кто никогда не доверяет механизму сериализации при переходе через перекрестный язык/кросс-платформу/перекрестные классы, которые могут меняться со временем? Если производительность не является критичной, я склонен сериализоваться в XML и обратно ... – Uri 2008-11-25 20:33:23

+0

@Uni, обычно я бы использовал сериализацию между процессами, если оба процесса получают сериализованные классы из той же самой банки, например, когда оба процессы находятся на одной машине. Если процессы находятся на разных машинах, я бы пошел на предмет XML. – 2008-11-25 20:49:10

ответ

5

Убедитесь, что классы, которые будут сериализованы, определяют и присваивают значение static final long serialVersionUID, и вы должны быть в порядке.

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

1

Классы библиотеки Java должны иметь совместимые сериализованные формы между 1.4 и 1.6, если иное не указано. Swing явно заявляет, что он несовместим между версиями, поэтому, если вы пытаетесь сериализовать объекты Swing, вам не повезло.

У вас могут возникнуть проблемы, когда код, созданный javac, несколько отличается. Это изменит serialVersionUID. Вы должны убедиться, что вы явно объявляете UID во всех своих сериализуемых классах.

3

Наряду с serialVersionUID структура пакета должна оставаться последовательной для сериализации, поэтому, если бы у вас было myjar.mypackage.myclass в 1.4, вы должны иметь myjar.mypackage.myclass в 1.6.

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

BTW, если вы реализуете Serializable в своих классах, вы должны получить предупреждение о компиляторе, если отсутствует serialVersionUID.

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

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

0

Если обе стороны используют один и тот же файл jar, он будет работать большую часть времени. Однако, если вы используете разные версии одного и того же пакета/модуля/фреймворка (например, различные баннеры веб-журналов или расширенное использование некоторых «редких» исключений), перед тем, как его можно будет утвердить, требуется много интеграционных тестов.

1

Нет, другая версия JVM не нарушит сериализацию.

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

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

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

Смежные вопросы