Boost / Property Tree确定值类型

时间:2016-03-28 18:38:34

标签: c++ boost rpc boost-propertytree ice

我想使用Boost / Property Tree作为与我的应用程序的一种同步。 为此,我计划使用Zeroc / ICE进行状态同步(使用Observe模式和双向连接)

但是,要以有效的方式执行此操作,我需要以某种方式指定应用程序的I / O (显然)

这很适合将值导入树(因为我可以使用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 个答案:

答案 0 :(得分:2)

属性树的概念提供了数据的分层存储(键值对),其中值为 text

就是这样。

如果您的应用程序将含义分配给该文本的内容,则元数据必须位于您的程序中。库中有没有变体叶存储。

即使基础序列化格式(例如JSON) 支持它也是如此,正如文档清楚地说明的那样,例如:

  
      
  • JSON值映射到包含该值的节点。但是,所有类型信息都丢失了;数字,以及文字“null”,“true”和“false”只是简单地映射到它们的字符串形式。
  •   

现在怎么办?

看起来你想要一个反射式框架,Boost Property Tree不提供它。我建议使用其他库,但所有这些库都要么进行侵入式更改,要么仍然需要手动为程序数据建模元数据。