yaml-cpp本地标签无法往返保留问题咨询
问题分析与解决
1. 这是bug还是使用方式有误?
这是yaml-cpp 0.7.0版本的已知bug,并非你的使用方式错误。
根据YAML规范,!x属于主标签(Primary Handle),标签内容应为x,类型对应_Tag::Type::PrimaryHandle。但yaml-cpp在反序列化时错误地将其识别为逐字标签(Verbatim),并且保留了标签开头的!符号,导致序列化后输出!<!x> 42这种不符合预期的格式。
2. 临时解决方法
可以手动修正加载后节点的标签类型和内容,通过以下代码实现:
auto y = YAML::Load(s); // 修正标签:去掉开头的!,重新设置为LocalTag std::string current_tag = y.Tag(); if (!current_tag.empty() && current_tag.front() == '!') { y.SetTag(YAML::LocalTag(current_tag.substr(1))); } // 验证输出 std::cout << "tag: " << y.Tag() << std::endl; std::cout << "after: " << YAML::Dump(y) << std::endl;
这段代码会将加载后错误的标签!x转换回正确的本地标签类型,此时y.Tag()会返回x,重新序列化后输出!x 42,符合预期结果。
注意:这种方法是针对0.7.0版本的临时 workaround,后续可关注yaml-cpp官方修复进度,升级到修复后的版本即可彻底解决该问题。
内容的提问来源于stack exchange,提问作者joergbrech
相关产品推荐
相关产品推荐

