Maison  >  Article  >  développement back-end  >  Comment sérialiser et désérialiser des classes avec des membres de type de données personnalisés en C ?

Comment sérialiser et désérialiser des classes avec des membres de type de données personnalisés en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-31 21:18:02126parcourir

How to Serialize and Deserialize Classes with Custom Data Type Members in C  ?

Sérialisation de classes avec des membres de type de données personnalisés en C

Problème :

Comment faire vous sérialisez et désérialisez efficacement une classe contenant plusieurs membres de types de données personnalisés ?

Réponse :

Pour sérialiser et désérialiser efficacement une classe contenant des types de données personnalisés, considérez ce qui suit :

Interface suggérée :

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

Implémentations :

<code class="cpp">std::vector<uint8_t> serialize(Mango const&amp; Man) {
    std::vector<uint8_t> bytes;
    do_generate(back_inserter(bytes), Man);
    return bytes;
}

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;
}

void serialize_to_stream(std::ostream&amp; os, Mango const&amp; Man)  {
    do_generate(std::ostreambuf_iterator<char>(os), Man);
}

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

Analyseurs de types de données personnalisés et Générateurs :

Ceux-ci gèrent la sérialisation/désérialisation de vos types de données personnalisés (voir la réponse pour des exemples détaillés).

Portabilité :

  • Assurez-vous que l'endianité est cohérente si nécessaire.
  • Envisagez d'utiliser Boost Endian (en-tête uniquement) pour normaliser l'endianité multiplateforme.

Remarques supplémentaires :

  • Les types de données personnalisés doivent être facilement copiables pour une sérialisation efficace.
  • Évitez d'utiliser directement la sérialisation boost car elle nécessite une liaison.
  • Envisagez d'utiliser l'assistant suggéré pour l'en-tête uniquement. fonctions pour la flexibilité et l'efficacité.

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