[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-serializatsiya-kak-izmenit-standartnoe-povedenie-serializatsii-deserializatsii":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},970,"kak-izmenit-standartnoe-povedenie-serializatsii-deserializatsii",30,"serializatsiya","Сериализация","📦","Как изменить стандартное поведение сериализации\u002Fдесериализации?","Существует два подхода: реализация `Externalizable` для полного контроля или определение специальных методов в `Serializable`-классе для точечной кастомизации.\n\n### Подход 1: интерфейс Externalizable\n\nПозволяет полностью описать логику сериализации и десериализации вручную. Во время десериализации **вызывается** конструктор без параметров, затем на созданном объекте вызывается `readExternal`.\n\n```java\npublic class User implements Externalizable {\n    private String name;\n    private int age;\n\n    public User() {} \u002F\u002F Обязателен для Externalizable\n\n    @Override\n    public void writeExternal(ObjectOutput out) throws IOException {\n        out.writeUTF(name);\n        out.writeInt(age);\n    }\n\n    @Override\n    public void readExternal(ObjectInput in) throws IOException {\n        this.name = in.readUTF();\n        this.age = in.readInt();\n    }\n}\n```\n\n### Подход 2: специальные методы в Serializable-классе\n\nЕсли у класса определены следующие методы, механизм сериализации использует их вместо поведения по умолчанию:\n\n| Метод | Назначение |\n|-------|-----------|\n| `private void writeObject(ObjectOutputStream out)` | Запись объекта в поток |\n| `private void readObject(ObjectInputStream in)` | Чтение объекта из потока |\n| `Object writeReplace()` | Подмена объекта перед записью (возвращает замещающий объект) |\n| `Object readResolve()` | Подмена объекта после чтения (возвращает замещающий объект) |\n\n### Сравнение подходов\n\n| Критерий | Serializable + методы | Externalizable |\n|----------|----------------------|---------------|\n| Конструктор при десериализации | Не вызывается | Вызывается (без параметров) |\n| Контроль | Частичный (можно дополнить стандартный) | Полный |\n| Объём кода | Меньше (по необходимости) | Больше (все поля вручную) |\n| `final`-поля | Поддерживаются | Не поддерживаются (нельзя задать после конструктора) |\n\n> **На собеседовании:** назовите оба подхода и подчеркните разницу в вызове конструктора. Упоминание `writeReplace`\u002F`readResolve` — сильный плюс, особенно в контексте Singleton-паттерна.","","middle",[15],"serialization",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":20,"featuredSnippetReady":23},"Как изменить стандартное поведение сериализации\u002Fдесериализац — Gymterview","Существует два подхода: реализация `Externalizable` для полного контроля или определение специальных методов в `Serializable`-классе для точечной кастомизации.","Существует два подхода: реализация `Externalizable` для полного контроля или определение специальных методов в `Serializ",[15,13],true]