Что такое сериализация и десериализация данных?

Ответ

Сериализация — это процесс преобразования структуры данных или объекта в памяти (например, структуры Go) в формат, который можно легко сохранить или передать по сети. Результатом является последовательность байт или текстовая строка.

Десериализация — это обратный процесс: восстановление исходной структуры данных или объекта из этой последовательности байт или строки.

Основные сценарии использования:

  1. Передача данных по сети: Клиент-серверное взаимодействие через API (REST, gRPC), отправка сообщений в очереди (Kafka, RabbitMQ).
  2. Сохранение состояния: Запись конфигурации в файл, сохранение пользовательской сессии или состояния приложения на диск.
  3. Кэширование: Хранение сложных объектов в системах кэширования (например, 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}
}