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, покажите два метода и подчеркните, что порядок записи/чтения должен совпадать. Плюсом будет назвать преимущество — полный контроль над форматом и размером данных.