cocos2d-x的高效稳定的YAML解析器

时间:2013-11-26 09:35:01

标签: c++ yaml cocos2d-x yaml-cpp

我正在使用cocos2d-x和C ++开发游戏,我需要为此应用程序加载一堆YAML文件。我尝试使用yaml-cpp库,效果非常好。

问题是这个库似乎非常不稳定(至少在iOS上的cocos2d-x下),因为几乎20%的时间它无法加载相同的YAML文件,导致“未找到地图的结尾”,“无效map元素“,或者像这些错误。

我按照HowToParseADocument指南,所以我认为我说得对。但是,由于它不是100%可靠,我正在寻找更稳定的东西。例如:

long size = 0;
unsigned char *yaml = FileUtils::getInstance()->getFileData("file.yml", "r", &size);
std::stringstream is;
is << yaml;

YAML::Parser parser(is);
YAML::Node doc;
while(parser.GetNextDocument(doc)) {
  instance->settings = doc.Clone();
}

解析器在parser.GetNextDocument(doc)调用时通常会中断。我试图阅读的文件是简单的YAML,其中key: value列表以这种简单的形式出现:

# Comment
section1:
  param1: value1
  param2: value2

# Comment
section2:
  param1: value1
  param2: value2

修改

我不允许透露原始YAML文件的内容,但我可以提供一些信息:

  1. 它只包含地图,而不包含数组,别名或其他特定结构
  2. 那些value是整数,浮点数或字符串
  3. 已成功this free tool,并取得了成功。
  4. 我用来阅读它的代码,在那里发布,它始终采用该形式,我不会修改它以使应用程序正确运行。这只是应用程序启动和工作或启动而不起作用。由于我在中间没有任何改变,我真的不明白发生了什么。

1 个答案:

答案 0 :(得分:1)

对解决方案有点难以猜测,因为你不会提供一个实际的例子,但是:

谁拥有unsigned char*返回的getFileData数据?如果该函数本身拥有数据,则在函数返回后它不再有效,因此可能会发生各种疯狂的事情。

要验证此处发生了什么(除了查看getFileData的实现之外),您可以在调用is.string()之前打印YAML::Parser parser(is);并查看是否打印出预期的YAML。