自学内容网 自学内容网

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

GitHub - felixguendling/cista: Cista is a simple, high-performance, zero-copy C++ serialization & reflection library.

C++ RPC ORM 高速解析-CSDN博客

C++类反射-CSDN博客


创作不易,小小的支持一下吧!


原文地址:https://blog.csdn.net/qq_30220519/article/details/142872767

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!