首頁 > 後端開發 > C++ > 如何序列化包含 std::string 的 C 類別?

如何序列化包含 std::string 的 C 類別?

DDD
發布: 2024-12-08 18:57:13
原創
610 人瀏覽過

How to Serialize a C   Class Containing an std::string?

使用std::string 序列化一個類別

序列化包含std::string 的類別會因為字串的指標而面臨挑戰以自然為基礎。將類別轉換為 char* 並將其寫入檔案的標準技術將不起作用,就像對於原始資料類型一樣。

自訂序列化函數

標準解決方法涉及為類別建立自訂序列化和反序列化函數。這些函數以受控方式處理類別資料的讀寫。

範例函數

對於包含名為「name」的 std::string的類,序列化和反序列化函數可以實現如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

std::ostream& MyClass::serialize(std::ostream& out) const {

    out << height;

    out << ',' // number separator

    out << width;

    out << ',' // number separator

    out << name.size(); // serialize size of string

    out << ',' // number separator

    out << name; // serialize characters of string

    return out;

}

 

std::istream&amp; MyClass::deserialize(std::istream&amp; in) {

    if (in) {

        int len = 0;

        char comma;

        in >> height;

        in >> comma; // read in the separator

        in >> width;

        in >> comma; // read in the separator

        in >> len; // deserialize size of string

        in >> comma; // read in the separator

        if (in &amp;&amp; len) {

            std::vector<char> tmp(len);

            in.read(tmp.data(), len); // deserialize characters of string

            name.assign(tmp.data(), len);

        }

    }

    return in;

}

登入後複製

重載流運算子

為了更方便使用,您可以重載類的流運算子:

1

2

3

4

5

6

7

8

9

std::ostream &amp;operator<<(std::ostream&amp; out, const MyClass &amp;obj) {

    obj.serialize(out);

    return out;

}

 

std::istream &amp;operator>>(std::istream&amp; in, MyClass &amp;obj) {

    obj.deserialize(in);

    return in;

}

登入後複製

使用這些函數和重載,您現在可以序列化和反序列化包含std的類別:: 只需使用流運算子即可字串。

以上是如何序列化包含 std::string 的 C 類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板