gpt4 book ai didi

c++ - 以二进制序列化和反序列化 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:33 24 4
gpt4 key购买 nike

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

每当我读回数据时, vector 的长度总是正确的,但数据要么是 0,要么是未定义的,要么是随机的。

class Example  
{
public:
std::vector<int> val;
};

写:

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

阅读:

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

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

最佳答案

您不能像您试图做的那样通过覆盖现有实例来反序列化非 POD 类 - 您需要为该类提供一个构造函数,该构造函数从流中读取数据并构造该类的新实例与它。

大体上,给定这样的东西:

class A {
A();
A( istream & is );
void serialise( ostream & os );
vector <int> v;
};

然后 serialise() 将写入 vector 的长度,然后写入 vector 内容。构造函数将读取 vector 长度,使用长度调整 vector 大小,然后读取 vector 内容:

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

关于c++ - 以二进制序列化和反序列化 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3438132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com