Gymterview
middle

Как создать собственный протокол сериализации?

Для создания собственного протокола сериализации нужно реализовать интерфейс Externalizable, который содержит два метода — writeExternal для записи и readExternal для чтения.

Пример
public interface Externalizable extends Serializable {
    void writeExternal(ObjectOutput out) throws IOException;
    void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}

Разработчик полностью контролирует, какие данные и в каком формате записываются в поток. Это позволяет оптимизировать размер данных, шифровать содержимое, менять порядок полей.

Пример собственного протокола
public class CompactUser implements Externalizable {
    private String name;
    private int age;
    private List<String> roles;

    public CompactUser() {} // Обязателен

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(name);
        out.writeByte(age); // byte вместо int — экономия 3 байт
        out.writeShort(roles.size());
        for (String role : roles) {
            out.writeUTF(role);
        }
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException {
        this.name = in.readUTF();
        this.age = in.readByte() & 0xFF;
        int size = in.readShort();
        this.roles = new ArrayList<>(size);
        for (int i = 0; i < size; i++) {
            roles.add(in.readUTF());
        }
    }
}

Важные особенности

  • Порядок чтения в readExternal должен строго совпадать с порядком записи в writeExternal
  • Конструктор без параметров обязателен — JVM вызывает его перед readExternal
  • final-поля невозможно заполнить в readExternal (поле уже инициализировано в конструкторе)
  • Externalizable наследует Serializable, поэтому объект может передаваться через ObjectOutputStream

На собеседовании: упомяните Externalizable, покажите два метода и подчеркните, что порядок записи/чтения должен совпадать. Плюсом будет назвать преимущество — полный контроль над форматом и размером данных.