[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-serializatsiya-java-serialization-vs-json-kogda-chto-ispolzovat":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},984,"java-serialization-vs-json-kogda-chto-ispolzovat",30,"serializatsiya","Сериализация","📦","Java Serialization vs JSON: когда что использовать?","Стандартная Java-сериализация (`Serializable`) и JSON-сериализация (Jackson, Gson) решают схожую задачу — преобразование объектов в переносимый формат, — но кардинально различаются по безопасности, совместимости и области применения.\n\n### Сравнительная таблица\n\n| Критерий | Java Serialization | JSON (Jackson и др.) | Бинарные форматы (Protobuf, Avro) |\n|----------|-------------------|---------------------|-----------------------------------|\n| Читаемость | Нет (бинарный) | Да (текстовый) | Нет (бинарный) |\n| Кросс-языковость | Только Java | Любой язык | Любой язык (кодогенерация) |\n| Производительность | Средняя | Средняя | Высокая |\n| Размер данных | Большой (метаданные) | Средний | Маленький |\n| Эволюция схемы | Хрупкая (`serialVersionUID`) | Гибкая (новые поля игнорируются) | Встроенная поддержка |\n| Безопасность | Опасная (атаки десериализации) | Безопасная (при правильной настройке) | Безопасная |\n| REST API | Не применимо | Стандарт | Используется в gRPC |\n\n### Почему Java Serialization опасна\n\nДесериализация данных из непроверенного источника может привести к Remote Code Execution (RCE). Атака основана на «gadget chains» — цепочках вызовов в библиотеках (Apache Commons Collections, Spring и др.), которые при десериализации выполняют произвольный код.\n\n```java\n\u002F\u002F ОПАСНО: десериализация из непроверенного источника\nObjectInputStream ois = new ObjectInputStream(untrustedInput);\nObject obj = ois.readObject(); \u002F\u002F Злоумышленник может выполнить произвольный код\n```\n\nС Java 9+ можно использовать `ObjectInputFilter` для ограничения допустимых классов, но это не решает проблему полностью:\n\n```java\nObjectInputFilter filter = ObjectInputFilter.Config.createFilter(\n    \"com.myapp.**;!*\"  \u002F\u002F Разрешить только свои классы\n);\nois.setObjectInputFilter(filter);\n```\n\n### Когда что выбрать\n\n| Формат | Когда использовать |\n|--------|-------------------|\n| **JSON** | REST API, конфигурации, межсервисное взаимодействие по HTTP, NoSQL (MongoDB), логирование |\n| **Protobuf \u002F gRPC** | Высоконагруженное межсервисное взаимодействие, когда важна производительность и размер |\n| **Avro** | Потоковая обработка (Kafka, Spark), event-driven архитектура с эволюцией схем |\n| **Java Serialization** | Практически не используется в новых проектах. Встречается в legacy, RMI |\n\n### Частые ошибки\n\n- Использование Java Serialization для межсервисного обмена — невозможно прочитать на стороне, написанной не на Java\n- Десериализация Java-объектов из непроверенных источников без фильтров — критическая уязвимость (CWE-502)\n- Хранение сериализованных Java-объектов в БД — невозможно мигрировать при изменении классов\n- Предположение, что JSON безопасен «автоматически» — полиморфная десериализация в Jackson (`@JsonTypeInfo`) тоже может быть вектором атаки\n\n> **На собеседовании:** главный тезис — Java Serialization не рекомендуется для новых проектов (позиция Oracle и OWASP). JSON — стандарт для API. Protobuf\u002FAvro — для высоконагруженных внутренних коммуникаций. Упомяните проблему безопасности (gadget chains) — это покажет глубокое понимание.","","middle",[15],"serialization",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Java Serialization vs JSON: когда что использовать? — Gymterview","Стандартная Java-сериализация (`Serializable`) и JSON-сериализация (Jackson, Gson) решают схожую задачу — преобразование объектов в переносимый формат, — но кар","Стандартная Java-сериализация (`Serializable`) и JSON-сериализация (Jackson, Gson) решают схожую задачу — преобразование",[15,13],"Стандартная Java-сериализация (`Serializable`) и JSON-сериализация (Jackson, Gson) решают схожую задачу — преобразование объектов в переносимый формат, — но кардинально различаются по безопасности, совместимости и области применения.",true]