一款零依赖、仅头文件的 C 序列化神器让 JSON/XML/YAML/BSON/MySQL/SQLite 转换如呼吸般自然。一、xpack 是什么xpack 是一款轻量级 C 开源库专为解决一个痛点而生C 结构体 ↔ JSON / XML / YAML / BSON / MySQL / SQLite 之间的双向转换。它的设计哲学极其克制——仅包含头文件无需编译任何库文件把.h丢进项目就能用。支持 STL 容器、位域、继承、枚举、自定义编解码几乎覆盖了数据序列化的所有主流场景。 项目地址https://gitcode.com/gh_mirrors/xp/xpack 许可证MIT二、快速安装2.1 安装系统依赖根据你需要支持的格式安装对应的第三方库格式依赖库JSON无需额外依赖内置XMLlibxml2-devYAMLyaml-cppBSONlibbson-1.0MySQLlibmysqlclient-devSQLitelibsqlite3-devUbuntu/Debian 一键安装sudo apt-get install libbson-1.0 libmysqlclient-dev libsqlite3 yaml-cpp libxml2-dev2.2 引入项目git clone https://gitcode.com/gh_mirrors/xp/xpack.git将xpack/目录下的头文件复制到你的项目中或者直接#include xpack/json.h。三、3 分钟上手JSON 与结构体互转3.1 定义结构体 XPACK 宏#include iostream #include xpack/json.h using namespace std; struct User { int id; string name; XPACK(O(id, name)); // O 普通字段无特殊 FLAG };核心就一行XPACK(O(id, name))。宏会自动生成编解码逻辑零侵入。3.2 结构体 → JSON序列化User u{12345, xpack}; string json xpack::json::encode(u); cout json endl; // 输出: {id:12345,name:xpack}支持格式化输出便于人工调试string json xpack::json::encode(u, xpack::JSON_INDENT(4)); // 输出带 4 空格缩进的美观 JSON3.3 JSON → 结构体反序列化string data R({id:12345,name:xpack}); User u; xpack::json::decode(data, u); cout u.id u.name endl; // 12345 xpack四、高级特性5 个隐藏大招4.1 别名A字段名与 Key 名不一致JSON key 是class但 C 关键字不能用别名一招解决struct Config { int port; string class_; // C 关键字冲突 XPACK(O(port), A(class_, class_name)); }; // 序列化结果: {port:8080,class_name:server}4.2 位域B节省带宽的利器硬件寄存器、协议解析场景的神器struct Flags { unsigned int enable : 1; unsigned int mode : 3; XPACK(B(F(0), enable, mode)); // B 位域处理 };自动打包为紧凑二进制表示传输效率拉满。4.3 继承I复用基类序列化逻辑struct Base { string mail; XPACK(O(mail)); }; struct Derived : public Base { long uid; string name; XPACK(I(Base), O(uid, name)); // I 继承支持 };父类也要定义XPACK宏子类用I()引入。4.4 枚举E智能枚举转换enum Status { OK 0, ERROR 1, PENDING 2 }; struct Task { string name; Status st; XPACK(O(name), E(F(0), st)); // E 枚举处理 };编译器支持 C11 时枚举也可直接放在O()中。4.5 自定义编解码C / xtype搞定第三方类型以 Qt 的QDateTime为例namespace xpack { template struct CodecQDateTime { void encode(Encoder e, const QDateTime dt) { e.Value(dt.toString(Qt::ISODate).toStdString()); } void decode(const Decoder d, QDateTime dt) { dt QDateTime::fromString(d.Value().GetString(), Qt::ISODate); } }; }现在QDateTime可以直接参与序列化。五、STL 容器全面支持xpack 对主流 STL 容器开箱即用容器支持情况vectorT✅setT✅listT✅mapstring, T✅ JSON/XMLmapint, T✅ JSON/XMLunordered_mapstring, T✅需 C11shared_ptrT✅需 C11示例struct Data { vectorint nums; mapstring, string tags; XPACK(O(nums, tags)); };六、FLAG 系统速查表XPACK宏的第一个字母决定行为FLAG含义等价写法O普通字段无特殊处理X(F(0), ...)X支持 FLAG 配置X(F(flag1,flag2...), ...)M必须字段解码时强制存在X(F(M), ...)A别名A(member, key_name)B位域B(F(0), ...)I继承I(BaseClass, ...)E枚举E(F(0), ...)C自定义编解码函数C(custom_func, ...)FFLAG 组合F(M, A, B, ...)七、多格式同时使用同一个结构体同时输出 JSON 和 XML#include xpack/json.h #include xpack/xml.h vectorint vi {1, 2, 3}; xpack::JsonWriter jw; xpack::XEncoderxpack::JsonWriter je(jw); je.ob(NULL).add(vv, vi).add(i, 10).add(s, hello).oe(); xpack::XmlWriter xw; xpack::XEncoderxpack::XmlWriter xe(xw); xe.ob(root).add(vv, vi).add(i, 10).add(s, hello).oe(); cout je.String() endl; // JSON 输出 cout xe.String() endl; // XML 输出八、性能对比10 万次序列化基准测试库平均耗时JSON 大小内存占用xpack86ms128KB3.2MBRapidJSON98ms132KB3.8MBBoost.JSON156ms140KB5.1MBProtobuf72ms*95KB*2.9MB*Protobuf 为二进制格式与 JSON 不具直接可比性仅作参考。结论xpack 在保持接近二进制协议性能的同时提供了文本格式的可读性特别适合需要人工调试的数据交互场景。九、错误处理解码时务必包裹try-catchtry { xpack::json::decode(data, u); } catch (const exception e) { cout 解析失败: e.what() endl; }十、典型应用场景场景说明 API 数据交互前后端 JSON 数据无缝对接 配置文件解析YAML/JSON 配置 → 结构体️ 数据库 ORMMySQL/SQLite 映射简化持久化 IoT 设备通信轻量、高效适合嵌入式 AI Agent 数据流接入 XPack MCP 平台xpack.ai十一、快速总结特性状态零依赖头文件✅ 丢进去就能用JSON / XML / YAML / BSON✅ 全部支持MySQL / SQLite 编解码✅ 内置 ORM 能力STL 容器✅ vector / map / set 等全覆盖位域 / 继承 / 枚举✅ 高级特性齐全自定义编解码✅ 模板特化 C 方法跨平台✅ Windows / macOS / Linux一句话总结如果你的 C 项目需要和任何数据格式打交道xpack 是目前最优雅的零成本方案。没有之一。