Эффективный и стабильный парсер YAML для cocos2d-x

Я разрабатываю игру, используя cocos2d-x и C ++, и мне нужно загрузить кучу YAML-файлов для этого приложения. Я пытался использовать YAML-каст библиотека с неплохими результатами.

Проблема заключается в том, что эта библиотека кажется очень нестабильной (по крайней мере, под cocos2d-x на iOS), так как почти 20% времени она не может загрузить тот же файл YAML, выдавая «конец карты не найден», «недопустимый элемент карты» или ошибки, подобные этим.

Я следовал за 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. Те values целые числа, числа с плавающей запятой или строки
  3. Это было связано с этот бесплатный инструмент, с успехом.

Код, который я использовал для его прочтения, размещен там, он всегда в той форме, и я не изменяю его, чтобы приложение работало правильно. Просто приложение запускается и работает или запускается и не работает. Поскольку я ничего не меняю в середине, я действительно не понимаю, что происходит.

-1

Решение

Сложно догадаться о решении, потому что вы не предоставите реальный пример, но:

Кто владеет данными на unsigned char* вернулся getFileData? Если эта функция сама владеет данными, то она больше не действительна после того, как функция вернется, и поэтому могут произойти всякие сумасшедшие вещи.

Чтобы проверить, что здесь происходит (кроме рассмотрения реализации getFileData), вы могли бы распечатать is.string() перед звонком YAML::Parser parser(is); и посмотрите, печатает ли это ожидаемый YAML.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]