Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mensiri Kelas C yang Mengandungi std::string?

Bagaimana untuk Mensiri Kelas C yang Mengandungi std::string?

DDD
DDDasal
2024-12-08 18:57:13573semak imbas

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

Mensiri Kelas dengan std::string

Mensiri kelas yang mengandungi std::string membentangkan cabaran disebabkan penuding rentetan -berasaskan alam semula jadi. Teknik standard menghantar kelas ke char* dan menulisnya ke fail tidak akan berfungsi, seperti yang dilakukan untuk jenis data primitif.

Fungsi Pensiri Tersuai

Penyelesaian standard melibatkan mencipta fungsi bersiri tersuai dan penyahserikatan untuk kelas. Fungsi ini mengendalikan pembacaan dan penulisan data kelas dengan cara terkawal.

Fungsi Contoh

Untuk kelas yang mengandungi std::string bernama "name", fungsi bersiri dan penyahsirilan boleh dilaksanakan seperti berikut:

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

Strim Lebih Muatan Operator

Untuk penggunaan yang lebih mudah, anda boleh terlebih muatan operator strim untuk kelas anda:

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

Dengan fungsi dan lebihan ini, anda kini boleh mensiri dan menyahsiri kelas yang mengandungi std :: rentetan dengan hanya menggunakan operator strim.

Atas ialah kandungan terperinci Bagaimana untuk Mensiri Kelas C yang Mengandungi std::string?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn