C++文档数据保存与解析
用例
#ifdef SINGLE_HEADER
#include "cista.h"
#else
#include <fstream>
#include "cista/reflection/member_index.h"
#include "cista/serialization.h"
#endif
int main() {
// 成员属性反射
struct test {
int a, b, c;
};
assert(0 == cista::member_index(&test::a));
assert(1 == cista::member_index(&test::b));
assert(2 == cista::member_index(&test::c));
// 文档数据定义
namespace data = cista::raw;
struct DocDataV1 {
int version_{1}; // 版本号
float x; // 基础类型
float y;
data::string name;
data::vector<int> v; // stl 容器
struct { // 嵌套
data::hash_map<data::string, data::string> m; // stl 容器
} j;
data::unique_ptr<test> testPtr; // 指针
};
// 版本检测
struct version_detection {
int version_{0};
};
DocDataV1 saveData;
saveData.x = 0.1232312f;
saveData.y = 100002.232323f;
saveData.name = "hello";
saveData.v = {1, 2, 3};
saveData.j.m = {{"key", "value"}};
saveData.testPtr = data::make_unique<test>(0, 1, 2);
auto buf = cista::serialize(saveData);
// 保存到文件
std::ofstream ofs("test.bin", std::ios::binary | std::ios::out);
ofs.write((char *)buf.data(), buf.size());
ofs.flush();
ofs.close();
// 从文件加载
std::ifstream ifs("test.bin", std::ios::binary | std::ios::in);
//指针定位到文件末尾
ifs.seekg(0, std::ios::end);
auto fileLength = ifs.tellg();
//指定定位到文件开始
ifs.seekg(0, std::ios::beg);
cista::buf ibuf(std::vector<uint8_t>(fileLength, 0));
ifs.read((char *)ibuf.addr(0), fileLength);
ifs.close();
// 版本检测,数据兼容
auto versionData = cista::unchecked_deserialize<version_detection>(ibuf);
assert(versionData->version_ == 1);
// 文档数据反序列化
auto loadData = cista::deserialize<DocDataV1>(buf);
// 正确性测试
assert(saveData.version_ == loadData->version_);
assert(saveData.x == loadData->x);
assert(saveData.y == loadData->y);
assert(saveData.name == loadData->name);
assert(saveData.v == loadData->v);
assert(saveData.j.m == loadData->j.m);
assert(saveData.testPtr->a == loadData->testPtr->a);
assert(saveData.testPtr->b == loadData->testPtr->b);
assert(saveData.testPtr->c == loadData->testPtr->c);
}
参考
创作不易,小小的支持一下吧!
原文地址:https://blog.csdn.net/qq_30220519/article/details/142872767
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!