Все три подхода позволяют представить данные в виде байтов, но отличаются управлением форматом и совместимостью.
Serializable — стандартная сериализация Java
Класс реализует
Serializable, а ObjectOutputStream записывает объект и связанные с ним сериализуемые объекты. По умолчанию сохраняются нестатические поля, не помеченные transient; поведение можно настроить.Это механизм Java, чувствительный к изменениям классов и не предназначенный для удобного обмена данными между разными языками.
Externalizable — явное управление записью и чтением
Класс реализует
writeExternal() и readExternal(). Разработчик определяет, какие данные записать, в каком порядке и как восстановить объект.Так можно сократить объём данных, но меньший размер и лучшая скорость не гарантированы. Совместимость версий и соответствие логики записи и чтения тоже придётся поддерживать самостоятельно.
Protocol Buffers — обмен данными по схеме
Структура сообщения описывается в
.proto:message User {
int64 id = 1;
string name = 2;
}Из схемы генерируется код для Java, Go, Python, C# и других языков. Приложения обмениваются сообщениями в компактном бинарном формате.
Подходит для межсервисного взаимодействия, gRPC и систем, где важна совместимость между языками. При изменении схемы нужно соблюдать правила эволюции — например, не переиспользовать номера удалённых полей.
Как запомнить:
• Serializable: Java берёт на себя стандартную запись состояния объекта.
• Externalizable: разработчик управляет записью и восстановлением.
• Protobuf: приложения обмениваются данными по общей схеме.
Важное уточнение: сериализация — общее название процесса, и Protobuf тоже является способом сериализации. Здесь сравниваются именно механизмы Java и отдельный формат обмена данными.
👉 Java Portal
