Современные альтернативы: JSON и Protocol Buffers
Заменяйте сериализацию Java на JSON от Jackson и Protocol Buffers для переносимого и безопасного хранения данных.
«Современные альтернативы: JSON и Protocol Buffers» — бесплатный урок Java Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Зачем заменять сериализацию Java
Сериализация Java работает только в JVM, многословна, медленна и небезопасна. Современные приложения предпочитают JSON — читаемый человеком и независимый от языка — или буферы протоколов, компактные, основанные на схеме и быстрые.
Jackson: фактический стандарт для JSON
ObjectMapper из Jackson преобразует объекты в строки JSON и обратно. Добавьте com.fasterxml.jackson.core:jackson-databind в проект.
ObjectMapper mapper = new ObjectMapper();
User user = new User("Alice", 30);
String json = mapper.writeValueAsString(user);
System.out.println(json); // {"name":"Alice","age":30}
User restored = mapper.readValue(json, User.class);Настройка Jackson с помощью аннотаций
Используйте @JsonProperty, @JsonIgnore, @JsonAlias и @JsonFormat, чтобы управлять сериализацией, не изменяя имена полей в модели.
public class Product {
@JsonProperty("product_name")
private String name;
@JsonIgnore
private String internalCode;
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate releaseDate;
}Модули Jackson: поддержка времени Java
Зарегистрируйте JavaTimeModule, чтобы правильно сериализовать LocalDate, LocalDateTime и Instant, а не получать объект JSON, заполненный множеством полей.
ObjectMapper mapper = new ObjectMapper()
.registerModule(new JavaTimeModule())
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
String json = mapper.writeValueAsString(LocalDate.now());
System.out.println(json); // "2024-06-15"GSON как лёгкая альтернатива
GSON от Google проще Jackson: для базовых типов не требуется настройка, но ему не хватает богатства аннотаций Jackson и производительности при большом масштабе.
Gson gson = new Gson();
String json = gson.toJson(new User("Bob", 25));
User user = gson.fromJson(json, User.class);Что такое буферы протоколов
Буферы протоколов (Protobuf) — это двоичный формат сериализации от Google. Вы определяете схему .proto, компилируете её в классы Java и получаете компактные сообщения со встроенным управлением версиями.
// user.proto
syntax = "proto3";
message UserProto {
string name = 1;
int32 age = 2;
}Кодирование сообщения Protobuf
У сгенерированных классов есть API построителя. Вызовите toByteArray(), чтобы получить двоичную полезную нагрузку, и parseFrom(bytes), чтобы декодировать её.
UserProto user = UserProto.newBuilder()
.setName("Alice")
.setAge(30)
.build();
byte[] bytes = user.toByteArray();
UserProto restored = UserProto.parseFrom(bytes);
System.out.println(restored.getName());Компромиссы между JSON и Protobuf
JSON читаем человеком и не требует схемы; Protobuf в 3–10 раз компактнее и быстрее, но требует схемы и генерации кода. Выбирайте JSON для REST API, а Protobuf — для внутренних сервисов с высокой пропускной способностью.
Развитие схемы с Protobuf
Поля Protobuf нумеруются, а не именуются. Вы можете безопасно добавлять новые поля или объявлять старые устаревшими, не нарушая работу существующих клиентов, если никогда не переиспользуете номера полей.
// v2 of user.proto — backwards compatible
message UserProto {
string name = 1;
int32 age = 2;
string email = 3; // new in v2
}Переход с сериализации Java
Замените пути записи через ObjectOutputStream на ObjectMapper.writeValue() или writeTo() Protobuf. Сохраняйте старую сериализацию только для миграции устаревших данных.
Без гаджетов десериализации
JSON и Protobuf не вызывают произвольные конструкторы или методы во время десериализации, устраняя атаки через цепочки гаджетов, от которых страдает сериализация Java.
Быстрая проверка
Каково ключевое преимущество буферов протоколов перед JSON?
Итоги
Заменяйте сериализацию Java на JSON с Jackson для REST и удобства чтения либо на буферы протоколов для критичных к производительности сервисов. Оба варианта поддерживают взаимодействие между языками, развитие схемы и безопасны по своей конструкции.
Изучай Java с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 104
- Уроки
- 374
Часто задаваемые вопросы
Урок «Современные альтернативы: JSON и Protocol Buffers» бесплатный?
Да — полный текст урока «Современные альтернативы: JSON и Protocol Buffers» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Современные альтернативы: JSON и Protocol Buffers»?
Заменяйте сериализацию Java на JSON от Jackson и Protocol Buffers для переносимого и безопасного хранения данных. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Современные альтернативы: JSON и Protocol Buffers»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы сериализации Java
- Поля transient и serialVersionUID
- Пользовательская сериализация: writeObject и readObject
- Современные альтернативы: JSON и Protocol Buffers