Section 3 : Sérialisation des structures
La sérialisation est le processus de conversion des structures de données ou des objets en un format qui peut être stocké (par exemple, dans un fichier ou une mémoire tampon), ou transmis (par exemple, à travers un réseau) et reconstruit plus tard (peut-être dans un environnement différent).
Pour une structure Go, la sérialisation signifie la conversion de l'instance de la struct en un format qui peut être facilement stocké ou transmis. Le format cible peut être JSON, XML, texte brut ou tout autre format de données utilisable.
Reprenons l'exemple de la structure Person:
Et une instance de cette struct :
La sérialisation de cette instance de struct (dans le format JSON) transforme la struct en une chaîne JSON :
On peut ensuite enregistrer cette chaîne JSON dans un fichier, ou l'envoyer à travers un réseau, etc. Lorsque nous avons besoin d'utiliser ces données à nouveau, nous désérialisons la chaîne JSON en une instance de la struct Person. Cela permet de sauvegarder l'état de l'objet et de le restaurer plus tard, ou de le transmettre à un autre emplacement ou un autre système.
Dans certaines situations, selon les conventions utilisées, il peut être préférable de nommer les clés en JSON, qui correspondent aux noms des champs en Go, en utilisant le camelCase. Pour ce faire, on peut placer des étiquettes (tags) dans la déclaration des structures, qui seront utilisées dans le processus de conversion (voir les exemples plus bas). La déclaration de la structure Person deviendra :
La création des instances ne sera pas affectée, mais le résultat de la sérialisation donnera du JSON avec les noms spécifiés dans les étiquettes.
Exemple complet
Voici un exemple complet de sérialisation et désérialisation d'une structure vers/à partir une chaîne JSON.
Sortie :
Une instance de la structure
Personest créée avec le nom "John" et l'âge 30.p := Person{Name: "John", Age: 30}Cette instance est ensuite sérialisée au format JSON à l'aide de la fonction
json.Marshal. S'il y a une erreur lors de ce processus, elle est imprimée et la fonction retourne immédiatement.jsonData, err := json.Marshal(p) if err != nil { fmt.Println(err) return } fmt.Println(string(jsonData)) // Imprime: {"name":"John","age":30}Ensuite, une chaîne JSON représentant une autre personne (nom : "James", âge : 40) est désérialisée en une instance de la structure
Personen utilisant la fonctionjson.Unmarshal. Là encore, s'il y a une erreur lors de ce processus, elle est imprimée et la fonction retourne immédiatement.jsonStr := `{"name":"James","age":40}` var p2 Person err = json.Unmarshal([]byte(jsonStr), &p2) if err != nil { fmt.Println(err) return } fmt.Println(p2) // Imprime: {James 40}
La structure Person et ces opérations (sérialisation et désérialisation en JSON) sont prédominantes dans les scénarios où les données doivent être stockées, transférées ou traitées. JSON (JavaScript Object Notation) est un format populaire à ces fins en raison de sa simplicité et de sa compatibilité avec de nombreux langages, y compris Go.
Exemple d'écriture d'une structure dans un fichier
Dans la fonction section3b:
On commence par créer une instance
Personavec le nom "John" et l'âge 30, que l'on sérialise en JSON.Ensuite, on ouvre un fichier appelé "person.json" en mode écriture. Si le fichier n'existe pas, il sera créé (
os.O_CREATE). Si le fichier existe déjà, son contenu sera écrasé (os.O_WRONLY). Le chiffre0644est une valeur octale représentant les permissions du fichier.On écrit ensuite les données JSON dans le fichier.
Après cela, on lit les données du fichier dans un
byteslice.Enfin, on désérialise les données JSON pour recréer une instance
Personet on l'affiche.
Note: Assurez-vous de gérer vos erreurs correctement dans un véritable environnement de production. Ici, nous nous contentons d'imprimer les erreurs, mais en réalité, vous devriez les gérer d'une manière qui convient à votre application. Aussi, n'oubliez pas de fermer le fichier après l'avoir utilisé pour libérer les ressources système.
Exemple d'écriture d'une tranche de structures dans un fichier
D'accord, pour écrire et lire une tranche de Person, vous pouvez suivre un schéma similaire. Voici comment :
Dans la fonction section3c:
On commence par créer une tranche de
Personavec trois personnes, que l'on sérialise en JSON.Dans ce cas-ci, on utilise
json.MarshalIndentpour faciliter la lecture de la chaîne produite par un humain.On donne la chaîne vide come préfixe, et le caractère de tabulation pour le caractère d'indentation. On pourrait utiliser des espaces à la place, comme par exemple
" ".
On ouvre ensuite un fichier appelé "people.json" en mode écriture. Si le fichier n'existe pas, il est créé (
os.O_CREATE). Si le fichier existe déjà, son contenu est écrasé (os.O_WRONLY).On y écrit ensuite les données JSON.
On lit ensuite les données du fichier dans une tranche de
byte.Enfin, on désérialise ces données JSON pour créer une nouvelle tranche de
Personet on l'affiche.
S'il y a une erreur à chaque étape, celle-ci est affichée et la fonction retourne immédiatement.
Contenu du fichier people.json: