以二进制形式序列化和反序列化向量

Dam*_*n L 4 c++ binary file-io vector

我在尝试将矢量(std :: vector)序列化为二进制格式然后正确反序列化并能够读取数据时遇到问题.这是我第一次使用二进制格式(我使用的是ASCII,但现在已经变得难以使用)所以我只用一个整数向量开始简单.

每当我读回数据时,向量总是具有正确的长度,但数据是0,未定义或随机.

class Example  
{  
public:  
    std::vector<int> val;  
};
Run Code Online (Sandbox Code Playgroud)

写:

Example example = Example();  
example.val.push_back(10);  
size_t size = sizeof BinaryExample + (sizeof(int) * example.val.size()); 

std::fstream file ("Levels/example.sld", std::ios::out | std::ios::binary);

if (file.is_open())  
{  
    file.seekg(0);  
    file.write((char*)&example, size);  
    file.close();  
}
Run Code Online (Sandbox Code Playgroud)

读:

BinaryExample example = BinaryExample();

std::ifstream::pos_type size;  
std::ifstream file ("Levels/example.sld", std::ios::in | std::ios::binary | std::ios::ate);

if (file.is_open())  
{   
    size = file.tellg();

    file.seekg(0, std::ios::beg);
    file.read((char*)&example, size);
    file.close();
}
Run Code Online (Sandbox Code Playgroud)

有谁知道我做错了什么或做了什么或能够指出我需要做的方向?

小智 5

您不能通过覆盖现有实例来取消序列化非POD类 - 您需要为该类提供一个构造函数,该构造函数从流中读取数据并使用它构造类的新实例.

概括地说,给出这样的东西:

class A {
    A();   
    A( istream & is );    
    void serialise( ostream & os );
    vector <int> v;
};
Run Code Online (Sandbox Code Playgroud)

然后serialise()会写入向量的长度,然后是向量内容.构造函数将读取向量长度,使用长度调整向量大小,然后读取向量内容:

void A :: serialise( ostream & os ) {
    size_t vsize = v.size();    
    os.write((char*)&vsize, sizeof(vsize));
    os.write((char*)&v[0], vsize * sizeof(int) );
}

A :: A( istream & is ) {
    size_t vsize;
    is.read((char*)&vsize, sizeof(vsize));
    v.resize( vsize );
    is.read((char*)&v[0], vsize * sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)