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

Bagaimana untuk Mensiri Kelas yang Mengandungi std::string dalam C dengan betul?

Barbara Streisand
Lepaskan: 2024-12-10 03:41:09
asal
612 orang telah melayarinya

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

Mensiri Kelas yang Mengandungi std::string: Memahami Dilema Penunjuk

Serialization ialah teknik penting yang digunakan untuk mengekalkan keadaan objek untuk penyimpanan atau pemindahan. Walau bagaimanapun, kelas bersiri yang mengandungi std::strings membentangkan cabaran kerana sifat penunjuk std::strings.

Isu timbul apabila cuba mensiri kelas yang mengandungi std::strings dengan menghantarnya ke char * dan menulisnya ke fail. Pendekatan ini berfungsi untuk jenis data mudah tetapi gagal dengan std::strings kerana ia tidak mempertimbangkan kebergantungan penunjuk.

Penyelesaian Standard untuk Pensirilan Penunjuk

Untuk mengatasi isu ini, penyelesaian standard melibatkan memperkenalkan kaedah bersiri dan penyahserikan ke dalam kelas. Kaedah ini mengendalikan penulisan dan pembacaan data dalaman objek secara manual, termasuk penunjuk.

Contoh pelaksanaan mungkin seperti berikut:

// Serialization method
std::ostream& MyClass::serialize(std::ostream &out) const {
    // Serialize numeric values using the output stream
    out << height;
    out << ',' // Separator
    out << width;
    out << ',' // Separator
    
    // Serialize the std::string
    out << name.size(); // String length
    out << ',' // Separator
    out << name; // String characters
    
    return out;
}

// Deserialization method
std::istream&amp; MyClass::deserialize(std::istream &amp;in) {
    if (in) {
        // Deserialize numeric values using the input stream
        int len=0;
        char comma;
        in >> height;
        in >> comma; // Separator
        in >> width;
        in >> comma; // Separator
        
        // Deserialize the std::string
        in >> len; // String length
        in >> comma; // Separator
        if (in &amp;&amp; len) {
            std::vector<char> tmp(len);
            in.read(tmp.data() , len); // String characters
            name.assign(tmp.data(), len);
        }
    }
    return in;
}
Salin selepas log masuk

Melebihi beban pengendali strim boleh memudahkan penggunaan ini kaedah:

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;}
Salin selepas log masuk

Dengan menggunakan teknik ini, std::strings boleh disiri dan dinyahsiri dengan berkesan sebagai sebahagian daripada kelas yang lebih besar, memelihara integriti dan kebergantungan penunjuk mereka.

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan