网站首页> 文章专栏> 一个真正意义上的序列化引擎
一个真正意义上的序列化引擎
目前C++的序列化库都是每种格式写一个序列化库,比如json库都有十几个库,有rapidjson,boost.json,xxx json...,每个库的实现也不同,xml序列化库也是如此,如果一个新的序列化格式出来了,那么再写一套库。这是合理的吗?
不妨回到序列化/反序列化的本质来看这个问题,从面向对象的角度来说,序列化无非是把一个对象转换成某种数据格式,不管数据格式怎么变化,是json、xml还是protobuf也好,其核心元数据是不变的,这个元数据就是指对象字段的名称、字段的类型、字段的索引等信息,有了这个元数据,随便序列化成什么数据格式都没问题。所以序列化的核心是如何获取对象的元数据,而这正是编译期反射要做的事,如果有一套完整的编译期反射接口,它可以很方便的访问对象的元数据,那么理论上只需要一个序列化引擎就够了,基于编译期反射的序列化引擎可以将元数据序列化到任意格式。
iguana正是这样一个序列化引擎,它的理念就是先将对象的元数据反射出来,然后再序列化到不同的数据格式。
一个对象可以随便转换成任意你想要的数据格式,这才是我们希望和想要的。来看看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 免费报名
报名邮件格式
姓名:
电话:
公司/单位:
上述三项必填,否则视为无效报名!
地址: www.purecpp.cn
转载请注明出处!
purecpp
一个很酷的modern c++开源社区
purecpp社区自2015年创办以来,以“Newer is Better”为理念,相信新技术可以改变世界,一直致力于现代C++研究、应用和技术创新,期望通过现代C++的技术创新来提高企业生产力和效率。
社区坚持只发表原创技术文章,已经累计发表了一千多篇原创C++技术文章;
组织了十几场的C++沙龙和C++大会,有力地促进了国内外C++开发者之间的技术交流;
开源了十几个现代C++项目,被近百家公司所使用,有力地推动了现代C++在企业中的应用。
期待更多的C++爱好者能参与到社区C++社区的建设中来,一起为现代C++开源项目添砖加瓦,一起完善C++基础设施和生态圈。
微信公众号:purecpp, 社区邮箱: purecpp@163.com