YAML反序列化时node.size()返回0问题排查求助
问题原因及解决方案
核心问题:节点访问路径错误
你序列化生成的YAML根节点是序列(Sequence),而非直接包含color键的映射(Map)。从序列化代码看,最终生成的YAML内容结构大致如下:
- Material - color: [1.0, 0.5, 0.0, 1.0]
当你用YAML::LoadFile加载后,data变量指向的是这个根序列节点。此时直接访问data["color"]会返回一个未定义节点(m_isDefined = false),因为序列节点不支持键值访问,自然node.size()会返回0。
解决方法
方法1:修正反序列化的节点访问路径
先获取序列中的第二个元素(索引为1,第一个元素是字符串"Material"),再从中读取color键:
YAML::Node data = YAML::LoadFile("assets/SerializationTest/Test.mat"); // 先访问序列的第二个节点(映射类型),再取color键 Color col = data[1]["color"].as<Color>();
方法2:调整序列化结构(更推荐)
将根节点改为映射结构,更符合常规配置文件的可读性和易用性:
YAML::Emitter out; out << YAML::BeginMap; out << YAML::Key << "type" << YAML::Value << "Material"; out << YAML::Key << "color" << YAML::Value << material.color; out << YAML::EndMap; std::ofstream fout("assets/SerializationTest/Test.mat"); fout << out.c_str();
此时生成的YAML结构为:
type: Material color: [1.0, 0.5, 0.0, 1.0]
反序列化时就可以直接用你原来的代码:
YAML::Node data = YAML::LoadFile("assets/SerializationTest/Test.mat"); Color col = data["color"].as<Color>();
额外检查点
确保你的convert<Copper::Color>模板特化是定义在YAML命名空间下的,否则yaml-cpp无法自动识别这个序列化/反序列化规则:
namespace YAML { template<> struct convert<Copper::Color> { // ... 你的encode/decode实现 ... }; } // namespace YAML
内容的提问来源于stack exchange,提问作者JacobDev
相关产品推荐
相关产品推荐

