ホームページ  >  記事  >  バックエンド開発  >  C でカスタム データ型メンバーを含むクラスをシリアル化および逆シリアル化する方法

C でカスタム データ型メンバーを含むクラスをシリアル化および逆シリアル化する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-31 21:18:02126ブラウズ

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

C でのカスタム データ型メンバーを持つクラスのシリアル化

問題:

方法カスタム データ型の複数のメンバーを含むクラスを効率的にシリアル化および逆シリアル化しますか?

回答:

カスタム データ型を含むクラスを効率的にシリアル化および逆シリアル化するには、次の点を考慮してください。 :

推奨インターフェイス:

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

実装:

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

カスタム データ型パーサーとジェネレーター:

これらは、カスタム データ型のシリアル化/逆シリアル化を処理します (詳細な例については、回答を参照してください)。

移植性:

  • 必要に応じて、エンディアンが一貫していることを確認します。
  • クロスプラットフォームのエンディアンを正規化するには、ブースト エンディアン (ヘッダーのみ) の使用を検討してください。

追加メモ:

  • 効率的なシリアル化のために、カスタム データ型は簡単にコピーできる必要があります。
  • リンクが必要なため、ブースト シリアル化を直接使用することは避けてください。
  • 推奨されるヘッダーのみのヘルパーの使用を検討してください。柔軟性と効率性を高める機能。

以上がC でカスタム データ型メンバーを含むクラスをシリアル化および逆シリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。