У меня есть одна java-программа, которая должна быть скомпилирована как 1.4, и другая программа, которая может быть чем угодно (так, 1.4 или 1.6), а две должны передавать сериализованные объекты взад и вперед. Если я определяю сериализуемый класс в месте, где обе программы могут его видеть, будет ли сериализация Java по-прежнему работать, или мне нужно только 1.6-1.6 или 1.4-1.4?Java Serialization 1.4 vs 1.6
ответ
Убедитесь, что классы, которые будут сериализованы, определяют и присваивают значение static final long serialVersionUID
, и вы должны быть в порядке.
Это, как правило, я бы этого не делал. Мое предпочтение состоит в том, чтобы использовать обычную сериализацию только в рамках одного процесса, или между двумя процессами находятся на одном компьютере и получают сериализованные классы из одного и того же файла jar. Если это не так, сериализация в XML - это лучший и безопасный выбор.
Классы библиотеки Java должны иметь совместимые сериализованные формы между 1.4 и 1.6, если иное не указано. Swing явно заявляет, что он несовместим между версиями, поэтому, если вы пытаетесь сериализовать объекты Swing, вам не повезло.
У вас могут возникнуть проблемы, когда код, созданный javac, несколько отличается. Это изменит serialVersionUID
. Вы должны убедиться, что вы явно объявляете UID во всех своих сериализуемых классах.
Наряду с serialVersionUID
структура пакета должна оставаться последовательной для сериализации, поэтому, если бы у вас было myjar.mypackage.myclass
в 1.4, вы должны иметь myjar.mypackage.myclass
в 1.6.
Нередко есть версия Java или версия для релиза в структуре пакета. Даже если serialVersionUID остается тем же самым между компиляциями, структура пакета приведет к тому, что исключение несовместимой версии будет выбрано во время выполнения.
BTW, если вы реализуете Serializable
в своих классах, вы должны получить предупреждение о компиляторе, если отсутствует serialVersionUID
.
На мой взгляд (и на основе некоторых лет довольно горького опыта) Java-сериализация Java чревата проблемами и, по возможности, следует избегать, особенно если есть отличная поддержка XML/JSON. Если вам нужно сериализовать изначально, то я рекомендую вам скрыть свои классы за интерфейсами и внедрить фабричный шаблон в фоновом режиме, который при необходимости создаст объект нужного класса.
Вы также можете использовать эту абстракцию для обнаружения исключения несовместимой версии и выполнять любое преобразование за кулисами для переноса данных в ваших объектах.
Если обе стороны используют один и тот же файл jar, он будет работать большую часть времени. Однако, если вы используете разные версии одного и того же пакета/модуля/фреймворка (например, различные баннеры веб-журналов или расширенное использование некоторых «редких» исключений), перед тем, как его можно будет утвердить, требуется много интеграционных тестов.
Нет, другая версия JVM не нарушит сериализацию.
Если некоторые из объектов, которые вы сериализуете, относятся к среде выполнения Java, и их классы эволюционировали несовместимо, вы увидите сбои. Большинство основных классов Java осторожно относятся к этому, но в некоторых случаях в некоторых пакетах были разрывы.
Я успешно использовал сериализацию (в контексте RMI) с классами из разных компиляций на разных машинах, работающих на разных версиях среды исполнения Java в течение многих лет.
Я не хочу отклоняться слишком далеко от исходного вопроса, но хочу отметить, что развитие сериализованного класса всегда требует ухода независимо от формата. Это не проблема, связанная с сериализацией Java. Вы должны иметь дело с теми же концепциями, независимо от того, выполняете ли вы сериализацию в XML, JSON, ASN.1 и т. Д. Сериализация Java дает довольно четкую спецификацию того, что разрешено, и как внести изменения, которые разрешены. Иногда это является ограничительным, иногда полезно иметь рецепт.
- 1. Java Serialization vs XML
- 2. Java Serialization vs JSON vs XML
- 3. Производительность Java 1.6 vs C++?
- 4. Java Serialization vs Plain text file
- 5. C# Marshalling vs Serialization
- 6. Какие существуют популярные версии Java версий (1.3/1.4/1.5/1.6/...)?
- 7. Java Serialization
- 8. Java Serialization
- 9. Версии и терминология Java, 1.6 vs 6.0 OpenJDK vs Sun
- 10. StackOverflowError 1.5 vs 1.6
- 11. Разница между hashmap 1.4 и 1.6
- 12. Миграция с Subversion 1.4 до 1.6
- 13. Linq to SQL vs Serialization
- 14. Исправленная обратная совместимость 1.6 vs 2.0
- 15. Xml serialization JAXB vs Jackson-dataformat-xml?
- 16. Typcript HTMLElement отключен от 1.4 до 1.6, что произошло (TS2339)?
- 17. Java Serialization различная версия Java
- 18. Java Serialization Object
- 19. java static variable serialization
- 20. Уточнение на Java Serialization
- 21. Версии Serialization в Java
- 22. Java: Generic JAXB Serialization
- 23. Ошибка Java Serialization
- 24. Java Serialization - класс оболочки
- 25. java serialization и inheritance
- 26. Как обновить файл jar от jdk 1.4 до jdk 1.6?
- 27. OpenNETCF 1.4 Vs OpenNETCF 2.3
- 28. jQuery 1.3 vs 1.4 (Performance)
- 29. java 1.6 enum issue com.ibm.ws.webservices.engine.enum.Style.WRAPPED
- 30. Binary Serialization vs App Settings (user.config)
Я единственный, кто никогда не доверяет механизму сериализации при переходе через перекрестный язык/кросс-платформу/перекрестные классы, которые могут меняться со временем? Если производительность не является критичной, я склонен сериализоваться в XML и обратно ... – Uri 2008-11-25 20:33:23
@Uni, обычно я бы использовал сериализацию между процессами, если оба процесса получают сериализованные классы из той же самой банки, например, когда оба процессы находятся на одной машине. Если процессы находятся на разных машинах, я бы пошел на предмет XML. – 2008-11-25 20:49:10