Я хотел бы использовать Boost / Property Tree как своего рода синхронизацию с моим приложением.
Для этого я планировал использовать Zeroc / ICE для синхронизации состояний (используя шаблон наблюдения и двунаправленные соединения).
Однако, чтобы сделать это эффективным способом, мне нужно как-то указать ввод / вывод приложения. (Очевидно).
Это хорошо работает для импорта значений в дерево (поскольку я могу использовать 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);
Концепция дерева свойств обеспечивает иерархическое хранение данных (пар ключ-значение), где значение текст.
Вот и все.
Если ваше приложение назначает имея в виду к содержанию этого текста, метаданные должны быть в вашей программе. Есть нет Вариант хранения листьев в библиотеке.
Это также верно, даже если основной формат сериализации (например, JSON) делает поддержите это, поскольку документация ясно разъясняет, например:
- Значения JSON отображаются на узлы, содержащие значение. Однако вся информация о типах теряется; числа, а также литералы «null», «true» и «false» просто отображаются в их строковую форму.
Похоже, вы хотите иметь фреймворк в стиле отражения, а Boost Property Tree его не предоставляет. Я бы предложил другие библиотеки, но все они либо предполагают навязчивые изменения, либо все же требуют, чтобы вы моделировали метаданные для данных программы вручную.
Других решений пока нет …