Ответ
Сериализация — это процесс преобразования структуры данных или объекта в памяти (например, структуры Go) в формат, который можно легко сохранить или передать по сети. Результатом является последовательность байт или текстовая строка.
Десериализация — это обратный процесс: восстановление исходной структуры данных или объекта из этой последовательности байт или строки.
Основные сценарии использования:
- Передача данных по сети: Клиент-серверное взаимодействие через API (REST, gRPC), отправка сообщений в очереди (Kafka, RabbitMQ).
- Сохранение состояния: Запись конфигурации в файл, сохранение пользовательской сессии или состояния приложения на диск.
- Кэширование: Хранение сложных объектов в системах кэширования (например, Redis) в сериализованном виде.
Популярные форматы сериализации:
- JSON: Текстовый, человекочитаемый формат. Стандарт для веб-API.
- XML: Текстовый, более многословный формат. Часто используется в enterprise-системах.
- Gob: Бинарный, Go-специфичный формат. Очень быстрый и эффективный для коммуникации между Go-сервисами.
- Protocol Buffers (Protobuf): Бинарный формат от Google. Языконезависимый, компактный и высокопроизводительный. Идеален для gRPC и микросервисов.
Пример сериализации/десериализации в JSON на Go:
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name"`
Age int `json:"age,omitempty"` // omitempty - не включать поле, если оно имеет нулевое значение
}
func main() {
user := User{Name: "Alice", Age: 30}
// 1. Сериализация (объект -> JSON байты)
jsonData, err := json.Marshal(user)
if err != nil {
panic(err)
}
fmt.Println("Сериализованные данные:", string(jsonData)) // {"name":"Alice","age":30}
// 2. Десериализация (JSON байты -> объект)
var newUser User
err = json.Unmarshal(jsonData, &newUser)
if err != nil {
panic(err)
}
fmt.Println("Десериализованный объект:", newUser) // {Alice 30}
}