ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

xpack免侵入扩展:XPACK_OUT让第三方结构体轻松序列化

xpack免侵入扩展:XPACK_OUT让第三方结构体轻松序列化 xpack免侵入扩展XPACK_OUT让第三方结构体轻松序列化【免费下载链接】xpackconvert json/xml/bson to c struct项目地址: https://gitcode.com/gh_mirrors/xp/xpackxpack是一个纯头文件的C序列化库专用于在C结构体与json、xml、bson、yaml等格式之间互相转换。常规做法是在结构体内部加入XPACK宏来声明需要序列化的成员但遇到无法修改源码的第三方结构体例如系统库中的 timeval时这种侵入式方案就行不通了。xpack为此提供了免侵入扩展方案——XPACK_OUT宏无需改动任何第三方代码就能让第三方结构体轻松实现序列化与反序列化。痛点第三方结构体为什么无法侵入使用XPACK宏时你必须把宏写进结构体定义内部struct User { int id; string name; XPACK(O(id, name)); // 宏必须写在结构体内部 };这在处理自己定义的业务结构体时没有问题。但现实开发中你常常需要序列化以下类型的结构体系统库结构体如sys/time.h里的 timeval第三方SDK提供的数据结构团队其他成员维护、不方便改动的公共头文件。这些结构体的源码不能修改强行改动不仅破坏封装还会在升级依赖时引发冲突。这正是 xpack 提供 XPACK_OUT 的初衷。快速上手一行XPACK_OUT搞定timeval序列化XPACK_OUT 的用法与 XPACK 几乎一致唯一区别是它定义在结构体外部因此不会对目标类型产生任何侵入。来看最经典的例子——序列化系统结构体 timeval#include sys/time.h #include xpack/json.h // timeval 是第三方结构体无需改动其定义 XPACK_OUT(timeval, O(tv_sec, tv_usec)); struct T { int a; string b; timeval t; XPACK(O(a, b, t)); // 自己的结构体照常用XPACK };只要在全局命名空间写下这一行XPACK_OUT(timeval, O(tv_sec, tv_usec));timeval 就拥有了和普通XPACK结构体完全一致的序列化能力。完整示例编码与解码一次看明白把上述代码补全就可以直接运行体验int main() { T t, r; t.a 123; t.b xpack; t.t.tv_sec 888; t.t.tv_usec 999; string s xpack::json::encode(t); // 结构体 - json cout s endl; xpack::json::decode(s, r); // json - 结构体 cout r.a , r.b , r.t.tv_sec , r.t.tv_usec endl; }输出结果{a:123,b:xpack,t:{tv_sec:888,tv_usec:999}} 123,xpack,888,999可以看到timeval 嵌套在结构体中也能被完整地编码为 JSON 对象再被精确地解码回来全程没有改动 timeval 的一行源码。XPACK_OUT 与 XPACK 的核心区别两者功能等价差异主要体现在使用方式上对比项XPACKXPACK_OUT定义位置结构体内部结构体外部适用对象自己定义的结构体第三方/系统结构体侵入性有需修改源码无免侵入定义位置要求无限制必须位于全局命名空间在宏内部XPACK_OUT 同样支持 O、X、M、A、AF、B、I、E 等全部成员描述方式包括字段别名、必填标志M、忽略空值OE、位域、继承I以及自定义编解码C功能上与 XPACK 完全对齐。若第三方的基类需要序列化也只需在子类中用 I 包含父类即可。使用XPACK_OUT的三个注意事项必须在全局命名空间定义XPACK_OUT 会展开为 xpack 命名空间内的模板特化写在其他命名空间中会编译失败旧编译器兼容性VS2005 及更早版本存在 SFINAE 缺陷不支持通过 XPACK_OUT 再叠加定义 xtype这类场景请改用自定义编解码方案命名避让成员变量尽量不要以__x_pack开头以免与库内部符号冲突。相关资料想深入研究的读者可以查看以下源码与示例完整可运行示例example/xpack_out.cpp宏定义源码xpack.hXPACK_OUT 定义于第193-198行类型标记实现traits.his_xpack_out 模板位于第33-35行官方文档README.md中第三方类和结构体章节结语xpack 的 XPACK_OUT 用一行免侵入的声明优雅地解决了C第三方结构体序列化的难题无需修改第三方源码、无需写胶水代码只需在全局命名空间声明一次timeval 这类系统结构体就能和普通结构体一样被 JSON、XML、BSON 等格式无缝编解码。如果你的项目也经常要和第三方 SDK 的数据结构打交道这个免侵入扩展值得一试。【免费下载链接】xpackconvert json/xml/bson to c struct项目地址: https://gitcode.com/gh_mirrors/xp/xpack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表