Serializable, Externalizable и Protocol Buffers: в чём разница?
Serializable, Externalizable и Protocol Buffers: в чём разница? Все три подхода позволяют представить данные в виде байтов, но отличаются управлением форматом и совместимостью. 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 Библиотека | Мы в Телеграм