Maison >développement back-end >C++ >Comment sérialiser et désérialiser une classe C avec des types de données personnalisés ?

Comment sérialiser et désérialiser une classe C avec des types de données personnalisés ?

DDD
DDDoriginal
2024-10-30 05:39:03502parcourir

How to Serialize and Deserialize a C   Class with Custom Data Types?

Comment faire la sérialisation d'une classe ayant des membres de types de données personnalisés en C ?

Problème

Le but est de sérialiser et désérialiser une classe C Mango qui contient des membres de types de données personnalisés.

Implémentation

L'implémentation suggérée comprend les fonctions suivantes :

<code class="cpp">std::vector<uint8_t> serialize(Mango const& Man);
Mango                deserialize(std::span<uint8_t const> data);

void serialize_to_stream(std::ostream& os, Mango const& Man);
void deserialize(std::istream& is, Mango& Man);</code>

Personnalisations pour les types de données

Personnalisations sont requis pour tous les types pertinents (y compris ValType, FuntionMango, MangoType et Mango) :

<code class="cpp">// Define `do_generate` and `do_parse` functions
// for custom data types.</code>

Exemple de mise en œuvre

<code class="cpp">void serialize_to_stream(std::ostream& os, Mango const& Man) {
    do_generate(std::ostreambuf_iterator<char>(os), Man);
}

void deserialize(std::istream& is, Mango& Man) {
    Man = {}; // clear it!
    std::istreambuf_iterator<char> f(is), l{};
    if (!do_parse(f, l, Man))
        throw std::runtime_error("deserialize");
}</code>

Considérations sur la portabilité

  • Endianness Il peut être nécessaire de normaliser, ce qui peut être fait manuellement ou à l'aide d'une bibliothèque comme Boost Endian (en-tête uniquement).

Notes supplémentaires

  • Cette approche permet aux données d'être stocké et transféré efficacement entre différents processus ou systèmes.

Exemple en direct :

https://coliru.stacked-crooked.com/a/288829ec964a3ca9

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn