Sérialisation d'objets en Go (Golang) : JSON, XML, Gob et Protocol Buffers

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Sérialisation d'objets en Go (Golang) : de JSON à Protobuf

\n\n

La sérialisation est le processus de conversion d'une structure de données (objet, slice, map) en une séquence d'octets pour la sauvegarder dans un fichier, la transmettre sur un réseau ou la mettre en cache. Le processus inverse est la désérialisation. En Go (Golang), cette tâche est résolue par des paquets intégrés et des bibliothèques tierces. Le choix de l'outil dépend des exigences de vitesse, de taille des données, de lisibilité et de compatibilité avec d'autres langages.

\n\n

1. Paquet intégré encoding/json

\n\n

La méthode de sérialisation la plus populaire en Go. JSON est un format lisible par l'homme et multiplateforme. Le paquet encoding/json fournit les fonctions Marshal et Unmarshal.

\n\n
package main\n\nimport (\n    "encoding/json"\n    "fmt"\n    "log"\n)\n\ntype User struct {\n    ID    int    `json:"id"`\n    Name  string `json:"name"`\n    Email string `json:"email,omitempty"`\n}\n\nfunc main() {\n    user := User{ID: 1, Name: "Alice", Email: "alice@example.com"}\n\n    // Sérialisation\n    jsonData, err := json.Marshal(user)\n    if err != nil {\n        log.Fatal(err)\n    }\n    fmt.Println(string(jsonData)) // {"id":1,"name":"Alice","email":"alice@example.com"}\n\n    // Désérialisation\n    var decoded User\n    err = json.Unmarshal(jsonData, &decoded)\n    if err != nil {\n        log.Fatal(err)\n    }\n    fmt.Printf("%+v\\n", decoded)\n}
\n\n

Caractéristiques :

\n
    \n
  • Prise en charge des tags de structure pour configurer les noms de champs.
  • \n
  • Fonctionne avec les slices, les maps et les structures imbriquées.
  • \n
  • Plus lent que les formats binaires, mais pratique pour le débogage.
  • \n
  • Ne prend pas en charge les références cycliques.
  • \n
\n\n

2. encoding/xml — Sérialisation XML

\n\n

XML est utilisé dans SOAP, RSS et les fichiers de configuration. Le paquet encoding/xml fonctionne de manière similaire à JSON, mais avec les tags xml.

\n\n
type Book struct {\n    Title  string `xml:"title"`\n    Author string `xml:"author"`\n    Pages  int    `xml:"pages,attr"`\n}\n\nfunc main() {\n    book := Book{Title: "Go in Action", Author: "William Kennedy", Pages: 500}\n    xmlData, _ := xml.MarshalIndent(book, "", "  ")\n    fmt.Println(string(xmlData))\n    // <Book pages="500">\n    //   <title>Go in Action</title>\n    //   <author>William Kennedy</author>\n    // </Book>\n}
\n\n

Quand l'utiliser :

\n
    \n
  • Intégration avec des systèmes legacy.
  • \n
  • Schémas stricts (XSD).
  • \n
  • Données orientées document.
  • \n
\n\n

3. encoding/gob — Format binaire natif de Go

\n\n

Le paquet encoding/gob est créé spécialement pour Go. Il encode efficacement les données dans un format binaire et prend en charge les types complexes (interfaces, canaux, fonctions — avec des limitations).

\n\n
import "encoding/gob"\n\ntype Task struct {\n    ID     int\n    Status string\n}\n\nfunc main() {\n    var network bytes.Buffer\n    enc := gob.NewEncoder(&network)\n    dec := gob.NewDecoder(&network)\n\n    task := Task{ID: 42, Status: "done"}\n    err := enc.Encode(task)\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    var restored Task\n    err = dec.Decode(&restored)\n    fmt.Println(restored) // {42 done}\n}
\n\n

Avantages :

\n
    \n
  • Haute vitesse et compacité.
  • \n
  • Enregistrement automatique des types.
  • \n
  • Prise en charge des structures cycliques.
  • \n
\n\n

Inconvénient : incompatibilité avec d'autres langages.

\n\n

4. Protocol Buffers (protobuf) — Sérialisation binaire rapide

\n\n

Développé par Google. Nécessite la définition d'un schéma dans un fichier .proto et la génération de code via protoc. La bibliothèque google.golang.org/protobuf est le standard moderne.

\n\n
// user.proto\n// syntax = "proto3";\n// message User {\n//   int32 id = 1;\n//   string name =                    

Recommendations