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 его не предоставляет. Я бы предложил другие библиотеки, но все они либо предполагают навязчивые изменения, либо все же требуют, чтобы вы моделировали метаданные для данных программы вручную.