Ответ
В 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
для потоковой обработки без загрузки всего содержимого в память.