You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:30:32