在yaml-cpp中流式处理自定义类型的正确方式是什么?
YAML-CPP 0.6版本自定义类型适配方案说明
两种方案的适用场景差异
两种方案并非新旧版本迭代关系,在0.6版本中同时生效,对应不同的使用场景:
- 重载
YAML::Emitter的operator<<:仅适用于手动使用Emitter构建YAML输出的场景,仅负责输出逻辑,和解析能力、YAML::Node体系完全无关。 - 特化
YAML::convert<>模板:是官方推荐的全场景适配方案,覆盖序列化、反序列化全流程,只要你用到YAML::Node相关的API(包括node.as<自定义类型>()解析、node = 自定义对象赋值输出),都依赖该特化实现。
是否需要同时实现两种方案
绝大多数场景下不需要同时实现:
- 如果你仅用Emitter手动输出,完全不需要解析能力、也不使用
YAML::Node做数据中转,仅实现operator<<即可。 - 如果你需要序列化/反序列化能力,仅实现
YAML::convert<>特化即可:YAML-CPP内部已经默认实现了自定义类型到Emitter的输出逻辑,会自动调用convert<T>::encode把对象转为YAML::Node再输出到Emitter,无需重复编写输出逻辑。 - 仅当你需要Emitter直接输出的格式和
convert::encode生成的YAML格式不同时,才需要同时实现两种方案,此时两套逻辑独立运行,互不干扰。
关于encode/decode函数的实现要求
特化YAML::convert<>时没有强制要求两个函数都完整实现:
encode函数对应序列化逻辑,负责把自定义类型转为YAML::Nodedecode函数对应反序列化逻辑,负责把YAML::Node转为自定义类型
如果你仅需要序列化能力,不需要解析,decode函数可以直接返回false或者留空实现即可,文档示例给出完整实现仅为覆盖全场景的参考。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

