Boost Serialization生成空容器XML模板的问题求助
解决Boost 1.69.0序列化空容器时XML缺失元素结构的问题
Boost Serialization的XML归档默认只会序列化存在的数据——当std::vector<B>为空时,不会生成容器内元素的标签结构,这是因为它的核心设计是序列化实际数据,而非生成Schema模板。要在空容器下生成完整的XML结构,你需要手动干预序列化过程,强制输出元素的占位结构。
具体实现方法
通过拆分序列化的save和load函数(使用BOOST_SERIALIZATION_SPLIT_FREE),在save阶段判断容器是否为空,若为空则序列化一个默认构造的B对象作为结构占位符:
- 定义基础结构体
A和B:
#include <boost/serialization/vector.hpp> #include <boost/serialization/nvp.hpp> #include <boost/archive/xml_oarchive.hpp> #include <fstream> struct B { int id = 0; std::string name = ""; template<class Archive> void serialize(Archive& ar, const unsigned int version) { ar & BOOST_SERIALIZATION_NVP(id); ar & BOOST_SERIALIZATION_NVP(name); } }; struct A { int data = 0; std::vector<B> vec; };
- 为
A拆分序列化的保存与加载逻辑:
namespace boost { namespace serialization { template<class Archive> void save(Archive& ar, const A& a, const unsigned int version) { ar & BOOST_SERIALIZATION_NVP(a.data); // 先序列化vector本身 ar & BOOST_SERIALIZATION_NVP(a.vec); // 若vector为空,添加默认构造的B作为结构占位 if (a.vec.empty() && boost::archive::is_xml_output<Archive>::value) { B dummy; // 用vector元素默认标签名"item"序列化占位对象 ar & boost::serialization::make_nvp("item", dummy); } } template<class Archive> void load(Archive& ar, A& a, const unsigned int version) { ar & BOOST_SERIALIZATION_NVP(a.data); ar & BOOST_SERIALIZATION_NVP(a.vec); } } // namespace serialization } // namespace boost BOOST_SERIALIZATION_SPLIT_FREE(A)
- 测试序列化代码:
int main() { A a; a.data = 123; // 此时vec为空,但序列化后会包含完整的item结构 std::ofstream ofs("template.xml"); boost::archive::xml_oarchive oa(ofs); oa << BOOST_SERIALIZATION_NVP(a); return 0; }
效果说明
生成的XML会包含<vec>节点,即使容器为空也会有一个<item>子节点,完整保留B的结构(用默认值填充),你可以将这个XML作为模板使用,后续按需修改或移除占位的<item>节点。
内容的提问来源于stack exchange,提问作者Zozus
相关产品推荐
相关产品推荐

