Heim  >  Artikel  >  Backend-Entwicklung  >  Wie serialisiere und deserialisiere ich Klassen mit benutzerdefinierten Datentypmitgliedern in C?

Wie serialisiere und deserialisiere ich Klassen mit benutzerdefinierten Datentypmitgliedern in C?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-31 21:18:02125Durchsuche

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

Serialisierung von Klassen mit benutzerdefinierten Datentypmitgliedern in C

Problem:

Wie geht das? Sie serialisieren und deserialisieren Sie effizient eine Klasse, die mehrere Mitglieder benutzerdefinierter Datentypen enthält?

Antwort:

Um eine Klasse, die benutzerdefinierte Datentypen enthält, effizient zu serialisieren und deserialisieren, beachten Sie Folgendes :

Empfohlene Schnittstelle:

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

Implementierungen:

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

Benutzerdefinierte Datentypen-Parser und Generatoren:

Diese übernehmen die Serialisierung/Deserialisierung Ihrer benutzerdefinierten Datentypen (siehe Antwort für detaillierte Beispiele).

Portabilität:

  • Stellen Sie bei Bedarf sicher, dass Endianness konsistent ist.
  • Erwägen Sie die Verwendung von Boost Endian (nur Header), um Endianness plattformübergreifend zu normalisieren.

Zusätzliche Hinweise:

  • Benutzerdefinierte Datentypen müssen für eine effiziente Serialisierung problemlos kopierbar sein.
  • Vermeiden Sie die direkte Verwendung der Boost-Serialisierung, da diese eine Verknüpfung erfordert.
  • Erwägen Sie die Verwendung des vorgeschlagenen Nur-Header-Helfers Funktionen für Flexibilität und Effizienz.

Das obige ist der detaillierte Inhalt vonWie serialisiere und deserialisiere ich Klassen mit benutzerdefinierten Datentypmitgliedern in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn