Comment sérialiser et désérialiser une classe avec des membres de types de données personnalisés en C
Introduction
La sérialisation implique la conversion de l'état d'un objet dans un format qui peut être stocké puis reconstruit ultérieurement. Lorsqu'il s'agit de structures de données complexes telles que des classes avec des membres de types de données personnalisés, la sérialisation devient particulièrement pertinente.
问题
La question principale est double :
Réponse
Solution 1 : Implémentation de la fonction de sérialisation
Le prototype suggéré pour la fonction de sérialisation est :
<code class="cpp">std::vector<uint8_t> serialize(Mango const& Man);</code>
Cette fonction accepte un objet Mango par référence (Man) et renvoie un std::vecteur d'octets qui représentent les données sérialisées.
Solution 2 : Implémentation de la fonction de désérialisation
La fonction de désérialisation correspondante a le prototype suivant :
<code class="cpp">Mango deserialize(std::span<uint8_t const> data);</code>
Elle prend une étendue d'octets (données) et renvoie un objet Mango construit à partir des données désérialisées.
Implémentations suggérées
Basées sur les fonctions d'assistance décrites ci-dessous, ces implémentations suggérées offrent une sérialisation et une désérialisation efficaces :
<code class="cpp">// Serialization function std::vector<uint8_t> serialize(Mango const& Man) { std::vector<uint8_t> bytes; do_generate(back_inserter(bytes), Man); return bytes; } // Deserialization function Mango deserialize(std::span<uint8_t const> data) { Mango result; auto f = begin(data), l = end(data); if (!do_parse(f, l, result)) throw std::runtime_error("deserialize"); return result; }</code>
Aide à la sérialisation personnalisée
Ces fonctions d'assistance (implémentées dans l'espace de noms my_serialization_helpers) fournissent les fonctionnalités de sérialisation et d'analyse de base :
Générateurs (do_generate Functions) :
Analyseurs (fonctions do_parse) :
Sérialisation des types personnalisés
Pour sérialiser les types de données personnalisés au sein de la classe Mango, Des fonctions do_generate et do_parse supplémentaires sont définies pour chaque type :
Exemple Utilisation
L'exemple fourni démontre la sérialisation et la désérialisation d'un objet Mango, en vérifiant son intégrité par aller-retour et sortie de débogage.
Portabilité et endianité
L'endianisme n'est pas intrinsèquement pris en compte dans cette implémentation. Pour garantir la portabilité sur différentes architectures matérielles, une étape supplémentaire de normalisation de l’endianité peut être nécessaire. Des bibliothèques comme Boost Endian peuvent être utilisées à cette fin sans nécessiter de liaison de bibliothèque.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!