[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-serializatsiya-kak-sozdat-sobstvennyy-protokol-serializatsii":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},975,"kak-sozdat-sobstvennyy-protokol-serializatsii",30,"serializatsiya","Сериализация","📦","Как создать собственный протокол сериализации?","Для создания собственного протокола сериализации нужно реализовать интерфейс `Externalizable`, который содержит два метода — `writeExternal` для записи и `readExternal` для чтения.\n\n```java\npublic interface Externalizable extends Serializable {\n    void writeExternal(ObjectOutput out) throws IOException;\n    void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;\n}\n```\n\nРазработчик полностью контролирует, какие данные и в каком формате записываются в поток. Это позволяет оптимизировать размер данных, шифровать содержимое, менять порядок полей.\n\n\u003Cdetails>\n\u003Csummary>Пример собственного протокола\u003C\u002Fsummary>\n\n```java\npublic class CompactUser implements Externalizable {\n    private String name;\n    private int age;\n    private List\u003CString> roles;\n\n    public CompactUser() {} \u002F\u002F Обязателен\n\n    @Override\n    public void writeExternal(ObjectOutput out) throws IOException {\n        out.writeUTF(name);\n        out.writeByte(age); \u002F\u002F byte вместо int — экономия 3 байт\n        out.writeShort(roles.size());\n        for (String role : roles) {\n            out.writeUTF(role);\n        }\n    }\n\n    @Override\n    public void readExternal(ObjectInput in) throws IOException {\n        this.name = in.readUTF();\n        this.age = in.readByte() & 0xFF;\n        int size = in.readShort();\n        this.roles = new ArrayList\u003C>(size);\n        for (int i = 0; i \u003C size; i++) {\n            roles.add(in.readUTF());\n        }\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Важные особенности\n\n- Порядок чтения в `readExternal` должен строго совпадать с порядком записи в `writeExternal`\n- Конструктор без параметров **обязателен** — JVM вызывает его перед `readExternal`\n- `final`-поля невозможно заполнить в `readExternal` (поле уже инициализировано в конструкторе)\n- `Externalizable` наследует `Serializable`, поэтому объект может передаваться через `ObjectOutputStream`\n\n> **На собеседовании:** упомяните `Externalizable`, покажите два метода и подчеркните, что порядок записи\u002Fчтения должен совпадать. Плюсом будет назвать преимущество — полный контроль над форматом и размером данных.","","middle",[15],"serialization",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Как создать собственный протокол сериализации? — Gymterview","Для создания собственного протокола сериализации нужно реализовать интерфейс `Externalizable`, который содержит два метода — `writeExternal` для записи и `readE","Для создания собственного протокола сериализации нужно реализовать интерфейс `Externalizable`, который содержит два мето",[15,13],"Для создания собственного протокола сериализации нужно реализовать интерфейс `Externalizable`, который содержит два метода — `writeExternal` для записи и `readExternal` для чтения.",true]