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

Bagaimana untuk Mensiri dan Menyahseri Kelas C yang Mengandungi std::string dengan selamat?

Linda Hamilton
Linda Hamiltonasal
2024-12-05 12:33:14936semak imbas

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

Mensiri Kelas dengan std::string

Dalam C , mensiri objek selalunya melibatkan penghantaran objek ke tatasusunan aksara (char* ) dan menulisnya ke fail. Pendekatan ini berfungsi dengan baik untuk jenis data mudah seperti integer, tetapi isu timbul apabila berurusan dengan struktur data dinamik seperti std::string.

Apabila objek bersiri dinyahsiri, std::string yang terkandung di dalamnya mungkin menunjuk ke memori yang tidak wujud lagi, yang membawa kepada ralat "alamat di luar sempadan".

Untuk menangani isu ini, penyelesaian standard adalah dengan laksanakan kaedah bersiri tersuai dan penyahsirilan dalam kelas itu sendiri. Kaedah ini boleh mensiri dan menyahsiri saiz dan aksara std::string secara manual.

Pelaksanaan:

class MyClass {
    int height;
    int width;
    std::string name;

public:
    std::ostream& operator<<(std::ostream& out) const {
        out << height << ',' << width << ',' << name.size() << ',' << name;
        return out;
    }
    std::istream& operator>>(std::istream& in) {
        int len = 0;
        char comma;
        in >> height >> comma >> width >> comma >> len >> comma;
        if (len) {
            std::vector<char> tmp(len);
            in.read(tmp.data(), len);
            name.assign(tmp.data(), len);
        }
        return in;
    }
};

Penggunaan:

MyClass obj;
obj.height = 10;
obj.width = 15;
obj.name = "MyClass";

// Serialize to file
std::ofstream outfile("myclass.dat");
outfile << obj;
outfile.close();

// Deserialize from file
std::ifstream infile("myclass.dat");
infile >> obj;
infile.close();

Pendekatan tersuai ini memastikan bahawa std::string disiri dengan betul dan desirialisasi. Selain itu, ia menyediakan cara mudah untuk mensiri dan menyahsiri objek menggunakan pengendali strim (<< dan >>).

Atas ialah kandungan terperinci Bagaimana untuk Mensiri dan Menyahseri Kelas C yang Mengandungi std::string dengan selamat?. 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