网站首页> 文章专栏> 一个真正意义上的序列化引擎
一个真正意义上的序列化引擎
编辑时间:2024-09-07 02:32:22 作者:qicosmos 0条评论

一个真正意义上的序列化引擎

目前C++的序列化库都是每种格式写一个序列化库,比如json库都有十几个库,有rapidjson,boost.json,xxx json...,每个库的实现也不同,xml序列化库也是如此,如果一个新的序列化格式出来了,那么再写一套库。这是合理的吗?

不妨回到序列化/反序列化的本质来看这个问题,从面向对象的角度来说,序列化无非是把一个对象转换成某种数据格式,不管数据格式怎么变化,是json、xml还是protobuf也好,其核心元数据是不变的,这个元数据就是指对象字段的名称、字段的类型、字段的索引等信息,有了这个元数据,随便序列化成什么数据格式都没问题。所以序列化的核心是如何获取对象的元数据,而这正是编译期反射要做的事,如果有一套完整的编译期反射接口,它可以很方便的访问对象的元数据,那么理论上只需要一个序列化引擎就够了,基于编译期反射的序列化引擎可以将元数据序列化到任意格式。

iguana正是这样一个序列化引擎,它的理念就是先将对象的元数据反射出来,然后再序列化到不同的数据格式。

img

一个对象可以随便转换成任意你想要的数据格式,这才是我们希望和想要的。来看看iguana是怎么做的?

struct person {
  int id;
  std::string name;
  int age;
  bool operator==(person const& rhs) const {
    return id == rhs.id && name == rhs.name && age == rhs.age;
  }
};

TEST_CASE("test cpp20 serialize") {
  person p{1, "tom", 20};
  std::string json;
  iguana::to_json(p, json);
  person p1;
  iguana::from_json(p1, json);
  CHECK(p == p1);

  std::string xml;
  iguana::to_xml(p, xml);
  person p2;
  iguana::from_xml(p2, xml);
  CHECK(p == p2);

  std::string yaml;
  iguana::to_yaml(p, yaml);
  person p3;
  iguana::from_yaml(p3, yaml);
  CHECK(p == p3);

  std::string pb;
  iguana::to_pb(p, pb);
  person p4;
  iguana::from_pb(p4, pb);
  CHECK(p == p4);
  std::cout << "ok\n";
}

从这个简单的例子来看,iguana只需要一行代码就可以把一个对象转换json, xml, yaml, protobuf任意一种数据格式,没有侵入式,没有宏,一切都很完美。这就是基于C++编译期反射的序列化引擎的能力,而且通过iguana去扩展支持一种新的数据格式也是很简单的一件事,比如我希望把结构体序列化成json5的数据格式, json5的key是没有引号的。

struct point_t {
  int x;
  int y;
};

void test_json5() {
  point_t pt{2, 4};
  std::string json5;
  json5.append("{");
  ylt::reflection::for_each(pt, [&](auto &field, auto name) {
    json5.append(name).append(":").append(std::to_string(field)).append(",");
  });
  json5.back() = '}';
  CHECK(json5 == "{x:2,y:4}");
}

这次云栖大会的workshop上我将分享编译期反射和iguana的实现原理,然后动手实操,掌握编译期反射如何应用于实际开发的。

线下workshop机会难得,名额有限,报名从速(免费报名)。

注:线下workshop 没有直播。

报名方式:

发送报名邮件到purecpp@163.com 免费报名

报名邮件格式

姓名:

电话:

公司/单位:

上述三项必填,否则视为无效报名!


    出自:purecpp.cn

    地址: www.purecpp.cn

    转载请注明出处!


来说两句吧
登录才能发表评论。
最新评论
Absolutely

purecpp

一个很酷的modern c++开源社区


[社区开源项目列表,点击前往]


purecpp社区自2015年创办以来,以“Newer is Better”为理念,相信新技术可以改变世界,一直致力于现代C++研究、应用和技术创新,期望通过现代C++的技术创新来提高企业生产力和效率。


社区坚持只发表原创技术文章,已经累计发表了一千多篇原创C++技术文章;


组织了十几场的C++沙龙和C++大会,有力地促进了国内外C++开发者之间的技术交流;


开源了十几个现代C++项目,被近百家公司所使用,有力地推动了现代C++在企业中的应用。


期待更多的C++爱好者能参与到社区C++社区的建设中来,一起为现代C++开源项目添砖加瓦,一起完善C++基础设施和生态圈。


微信公众号:purecpp, 社区邮箱: purecpp@163.com


友情链接