[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-serializatsiya-kakie-sushchestvuyut-sposoby-kontrolya-za-znacheniyami-deserializovannogo-obekta":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},979,"kakie-sushchestvuyut-sposoby-kontrolya-za-znacheniyami-deserializovannogo-obekta",30,"serializatsiya","Сериализация","📦","Какие существуют способы контроля за значениями десериализованного объекта?","Контроль за значениями десериализованного объекта нужен для проверки инвариантов, валидации данных и защиты от подмены сериализованного потока.\n\n### 1. Интерфейс ObjectInputValidation\n\nПозволяет зарегистрировать валидацию, которая вызывается после полной десериализации объекта.\n\n```java\npublic class Person implements Serializable, ObjectInputValidation {\n    private String name;\n    private int age;\n\n    @Override\n    public void validateObject() throws InvalidObjectException {\n        if (age \u003C 0 || age > 150) {\n            throw new InvalidObjectException(\"Некорректный возраст: \" + age);\n        }\n        if (name == null || name.isBlank()) {\n            throw new InvalidObjectException(\"Имя не может быть пустым\");\n        }\n    }\n\n    private void readObject(ObjectInputStream in)\n            throws IOException, ClassNotFoundException {\n        in.defaultReadObject();\n        in.registerValidation(this, 0); \u002F\u002F регистрация валидации\n    }\n}\n```\n\n### 2. Валидация в readObject\n\nПроверка значений прямо в методе `readObject` — проще, но вызывается до завершения десериализации всего графа объектов.\n\n### 3. Шифрование и подпись\n\nДля защиты от подмены данных можно обернуть объект в защитные обёртки:\n\n| Класс | Назначение |\n|-------|-----------|\n| `javax.crypto.SealedObject` | Шифрование сериализованного объекта (нужен симметричный ключ) |\n| `java.security.SignedObject` | Цифровая подпись для проверки целостности |\n\nОба класса сами реализуют `Serializable` — оборачивают исходный объект, создавая защищённую «упаковку».\n\n### 4. ObjectInputFilter (Java 9+)\n\nФильтр десериализации, ограничивающий допустимые классы, глубину графа и размер данных:\n\n```java\nObjectInputFilter filter = ObjectInputFilter.Config.createFilter(\n    \"com.myapp.**;!*\"  \u002F\u002F Разрешить только свои классы\n);\nois.setObjectInputFilter(filter);\n```\n\n> **На собеседовании:** назовите `ObjectInputValidation` как основной механизм валидации и `ObjectInputFilter` (Java 9+) как защиту от атак десериализации. Упоминание `SealedObject`\u002F`SignedObject` — дополнительный плюс.","","middle",[15],"serialization",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":20,"featuredSnippetReady":23},"Какие существуют способы контроля за значениями десериализов — Gymterview","Контроль за значениями десериализованного объекта нужен для проверки инвариантов, валидации данных и защиты от подмены сериализованного потока.","Контроль за значениями десериализованного объекта нужен для проверки инвариантов, валидации данных и защиты от подмены с",[15,13],true]