C++和提升 XML 存档(序列化):是否可以指定元素的标记名称?(默认值:"item" )

C++ and Boost XML archive (serialization): Can I specify the tag name for elements? (default: "item")

本文关键字:元素 item 默认值 XML 存档 序列化 C++ 是否      更新时间:2023-10-16

我想将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模式,您可以记录的另一种序列化格式等