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