Как сериализовать и десериализовать данные в Go?

Ответ

В Go сериализация (преобразование данных в формат для хранения или передачи) и десериализация (обратный процесс) обычно выполняются с помощью стандартных пакетов encoding/json, encoding/xml, encoding/gob или encoding/binary.

JSON (наиболее популярный вариант):

Используется пакет encoding/json.

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

type Person struct {
    Name string `json:"name"` // Тег для кастомизации имени поля в JSON
    Age  int    `json:"age"`
    // Поля должны быть экспортируемыми (начинаться с заглавной буквы)
}

func main() {
    // Сериализация (Marshal): Go-структура -> JSON-байты
    person1 := Person{"Alice", 30}
    jsonData, err := json.Marshal(person1)
    if err != nil {
        log.Fatalf("Ошибка сериализации: %v", err)
    }
    fmt.Printf("JSON данные: %sn", string(jsonData)) // JSON данные: {"name":"Alice","age":30}

    // Для красивого вывода JSON (с отступами)
    prettyJSONData, err := json.MarshalIndent(person1, "", "  ")
    if err != nil {
        log.Fatalf("Ошибка сериализации с отступами: %v", err)
    }
    fmt.Printf("Красивый JSON:n%sn", string(prettyJSONData))

    // Десериализация (Unmarshal): JSON-байты -> Go-структура
    var person2 Person
    err = json.Unmarshal(jsonData, &person2)
    if err != nil {
        log.Fatalf("Ошибка десериализации: %v", err)
    }
    fmt.Printf("Десериализованная структура: %+vn", person2) // Десериализованная структура: {Name:Alice Age:30}
}

XML и Gob:

Работают аналогично, используя пакеты encoding/xml и encoding/gob соответственно. encoding/gob часто используется для передачи данных между Go-программами.

Protobuf:

Для высокопроизводительной и кросс-языковой сериализации часто используется Protocol Buffers (github.com/golang/protobuf или google.golang.org/protobuf). Требует определения схемы данных.

Бинарная сериализация:

Пакет encoding/binary позволяет читать и записывать данные в бинарном формате, что полезно для низкоуровневых протоколов или работы с файлами.

Важные нюансы:

  • Экспортируемые поля: Для сериализации/десериализации поля структуры должны быть экспортируемыми (начинаться с заглавной буквы).
  • Теги: Теги, такие как json:"name", позволяют управлять именами полей в сериализованном формате, пропускать поля (json:"-") или делать их опциональными (json:"name,omitempty").
  • Обработка ошибок: Всегда проверяйте возвращаемое значение err после операций сериализации/десериализации.
  • Потоковая обработка: Для работы с большими объемами данных используйте json.Encoder и json.Decoder с io.Reader и io.Writer для потоковой обработки без загрузки всего содержимого в память.