[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-serializatsiya-opishite-protsess-serializatsii-deserializatsii-s-ispolzovaniem-serializable":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},969,"opishite-protsess-serializatsii-deserializatsii-s-ispolzovaniem-serializable",30,"serializatsiya","Сериализация","📦","Опишите процесс сериализации\u002Fдесериализации с использованием Serializable","При использовании `Serializable` JVM применяет алгоритм сериализации, который через Reflection API автоматически записывает состояние объекта в поток байтов.\n\n### Алгоритм сериализации\n\n1. Запись метаданных о классе — имя класса, `serialVersionUID`, идентификаторы полей\n2. Рекурсивная запись описания суперклассов вплоть до `java.lang.Object` (не включительно)\n3. Запись примитивных значений полей, начиная с полей самого верхнего суперкласса\n4. Рекурсивная запись объектов, являющихся полями сериализуемого объекта\n\nРанее сериализованные объекты повторно не записываются — это позволяет корректно обрабатывать циклические ссылки и граф объектов.\n\n### Алгоритм десериализации\n\n1. Под объект выделяется память\n2. Поля заполняются значениями из потока\n3. Конструктор сериализуемого класса **не вызывается**\n4. Вызывается конструктор без параметров ближайшего **несериализуемого** родительского класса\n\nЕсли у несериализуемого суперкласса нет конструктора без параметров, при десериализации будет выброшено `InvalidClassException`.\n\n\u003Cdetails>\n\u003Csummary>Пример сериализации\u002Fдесериализации\u003C\u002Fsummary>\n\n```java\nimport java.io.*;\n\npublic class SerializationExample {\n    public static void main(String[] args) throws Exception {\n        User user = new User(\"Иван\", 30);\n\n        \u002F\u002F Сериализация\n        try (ObjectOutputStream oos = new ObjectOutputStream(\n                new FileOutputStream(\"user.ser\"))) {\n            oos.writeObject(user);\n        }\n\n        \u002F\u002F Десериализация\n        try (ObjectInputStream ois = new ObjectInputStream(\n                new FileInputStream(\"user.ser\"))) {\n            User restored = (User) ois.readObject();\n            System.out.println(restored); \u002F\u002F User{name='Иван', age=30}\n        }\n    }\n}\n\nclass User implements Serializable {\n    private static final long serialVersionUID = 1L;\n    private String name;\n    private int age;\n\n    public User(String name, int age) {\n        this.name = name;\n        this.age = age;\n    }\n    \u002F\u002F getters, toString...\n}\n```\n\n\u003C\u002Fdetails>\n\n### Частые ошибки\n\n- Ожидание вызова конструктора при десериализации — конструктор сериализуемого класса не вызывается, поэтому логика инициализации в нём не выполнится\n- Отсутствие `Serializable` у вложенных объектов — если поле класса не реализует `Serializable` и не помечено `transient`, будет `NotSerializableException`\n- Забыть про суперкласс — если родитель не `Serializable`, его поля не сохраняются, а при десериализации инициализируются через конструктор по умолчанию\n\n> **На собеседовании:** ключевой момент — конструктор не вызывается при десериализации `Serializable`-объекта, но вызывается конструктор без параметров у несериализуемого суперкласса. Это частый вопрос-ловушка.","","junior",[15],"serialization",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":20,"featuredSnippetReady":23},"Опишите процесс сериализации\u002Fдесериализации с использованием — Gymterview","При использовании `Serializable` JVM применяет алгоритм сериализации, который через Reflection API автоматически записывает состояние объекта в поток байтов.","При использовании `Serializable` JVM применяет алгоритм сериализации, который через Reflection API автоматически записыв",[15,13],true]