首頁  >  文章  >  後端開發  >  如何在 C 中序列化和反序列化具有自訂資料類型成員的類別?

如何在 C 中序列化和反序列化具有自訂資料類型成員的類別?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-31 21:18:02125瀏覽

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>

自訂資料類型解析器與產生器:

它們處理自訂資料類型的序列化/反序列化(有關詳細範例,請參閱答案)。

可移植性:

  • 必要時確保位元組順序一致。
  • 考慮使用 Boost Endian(僅標頭)來規範跨平台位元組順序。

附加說明:

  • 自訂資料類型必須易於複製才能實現高效序列化。
  • 避免直接使用 boost 序列化,因為它需要連結。
  • 考慮使用建議的僅標頭幫助程式功能靈活且有效率。

以上是如何在 C 中序列化和反序列化具有自訂資料類型成員的類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn