ホームページ  >  記事  >  バックエンド開発  >  カスタム データ型を使用して C クラスをシリアル化および逆シリアル化する方法は?

カスタム データ型を使用して C クラスをシリアル化および逆シリアル化する方法は?

DDD
DDDオリジナル
2024-10-30 05:39:03421ブラウズ

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

C でカスタム データ型のメンバーを持つクラスをシリアル化するにはどうすればよいですか?

問題

目的は、C クラスをシリアル化および逆シリアル化することです。カスタム データ型のメンバーを含む Mango。

実装

推奨される実装には次の関数が含まれます。

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

データ型のカスタマイズ

カスタマイズ関連するすべての型 (ValType、FuntionMango、MangoType、Mango を含む) に必要です:

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

実装例

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

移植性に関する考慮事項

  • エンディアン正規化が必要な場合がありますが、これは手動で行うことも、Boost Endian (ヘッダーのみ) などのライブラリを使用して行うこともできます。

補足

  • このアプローチにより、データを異なるプロセスまたはシステム間で効率的に保存および転送されます。

実際の例:

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

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

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