C++和提升 XML 存档(序列化):是否可以指定元素的标记名称?(默认值:"item" )
C++ and Boost XML archive (serialization): Can I specify the tag name for elements? (default: "item")
我想将STL容器(特别是std::set)序列化为XML。
我碰巧正在使用boost,我找不到为某些标签选择名称的方法-特别是,代表容器中的项目的标签。
我是这样做的:
std::set<something> my_set; // populate it somehow too
std::stringstream oss;
{
boost::archive::xml_oarchive oa(oss, boost::archive::no_header);
oa << boost::serialization::make_nvp("Things", my_set);
}
生成一个<Things> </Things>
字符串,my_set的元素作为<item>
标签。像这样:
<Things>
<item>element of set</item>
<item>another first element of set</item>
</Things>
是否有一种方法来控制什么标签是用于"项目"标签那里?
我知道序列化主要用于往返,在这个用例中XML标记名在很大程度上是任意的。然而,我试图通过依赖boost存档来获得一个便宜的"toXMLRecursive()"函数。如果结果证明这是不可能的,我将使用另一种方法(例如使用rapidxml或类似的方法手动构造XML)。
编辑:似乎快速而肮脏的解决方案只是专一化序列化函数来循环项目并自己选择'nvp'(即,重新实现集合的序列化),像这样:
template <typename Archive>
void serialize(Archive & ar, MySetType & me, const unsigned int /*version*/)
{
for (auto & el : me){
ar & boost::serialization::make_nvp("MyElementName", el);
}
}
…但我希望有另一种方式,这并不意味着我必须重新实现在我的项目中使用的所有STL类的序列化(如果两个类型冲突怎么办?必须对代码进行一些仔细的组织!
您可以制作自己的序列化包装器
- http://www.boost.org/doc/libs/1_61_0/libs/serialization/doc/wrappers.html
你可以看看boost/serialization/set.hpp
的实现,基本上复制/粘贴你想要的部分,然后根据口味进行更改。
。看来你是想控制存档格式。他们不应该对你有影响。如果另一端不使用Boost读取您的存档,请停止正在做的事情并重新设计。
使用protobuf,您自己的带有适当XML库的XML模式,您可以记录的另一种序列化格式等
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 从控制台中删除最后打印的元素
- C++和提升 XML 存档(序列化):是否可以指定元素的标记名称?(默认值:"item" )