Boost/Property Tree определяет тип значения

Я хотел бы использовать Boost/Property Tree как своего рода синхронизацию с моим приложением. Для этого я планировал использовать Zeroc/ICE для синхронизации состояний (используя шаблон Observe и двунаправленные соединения).

Однако, чтобы сделать это эффективным способом, мне нужно как-то указать ввод / вывод приложения (очевидно).

Это хорошо работает для импорта значений в дерево (так как я могу использовать InputStream для преобразования в любой примитивный тип и отлавливать возникающие ошибки), но затрудняет, когда я хочу экспортировать значения.

С функциями, представленными в документации, я не вижу способа получить фактический тип элемента

boost::property_tree::ptree Tree;

// Import
Ice::CommunicatorPtr communicator = current.adapter->getCommunicator();
Ice::InputStreamPtr in = Ice::createInputStream(communicator, item.data);

switch (item.type) {
    case BOOLVAL:
            double boolval;
            in->read(boolval);
            Tree.put(item.path, boolval);
            break;
}

// Export
// This is not possible since I cannot retrieve or compare the type
Ice::CommunicatorPtr communicator = current.adapter->getCommunicator();
Ice::OutputStreamPtr out = Ice::createOutputStream(communicator);
auto data = Tree.get<TYPE>(path);
out->write(data);

1 ответ

Концепция дерева свойств обеспечивает иерархическое хранение данных (пар ключ-значение), где значением является текст.

Вот и все.

Если ваше приложение присваивает смысл содержимому этого текста, метаданные должны быть в вашей программе. В библиотеке нет варианта хранения листьев.

Это также верно, даже если базовый формат сериализации (такой как JSON) действительно поддерживает его, как четко изложена в документации, например:

  • Значения JSON отображаются на узлы, содержащие значение. Однако вся информация о типах теряется; числа, а также литералы "null", "true" и "false" просто отображаются в их строковую форму.

Что теперь?

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

Другие вопросы по тегам