gpt4 book ai didi

C++ 和 Boost XML 存档(序列化): Can I specify the tag name for elements?(默认值: "item")

转载 作者:行者123 更新时间:2023-11-30 05:23:09 25 4
gpt4 key购买 nike

我想将一个 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 类的序列化(如果两个 typedef 发生冲突怎么办?必须仔细组织代码!)。

最佳答案

你可以制作自己的序列化包装器

您可以查看boost/serialization/set.hpp 的实现,基本上复制/粘贴您想要的部分,然后根据喜好进行更改。

然而。看来您正在尝试控制存档格式的杂项。他们对你来说应该无关紧要。如果另一端不使用 Boost 来读取您的存档,请停止您正在做的事情并重新设计。

使用 protobuf,您自己的 XML 模式和适当的 XML 库,另一种您可以记录的序列化格式等。

关于C++ 和 Boost XML 存档(序列化): Can I specify the tag name for elements?(默认值: "item"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39335161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com