Boost/Property Tree 确定值类型
Posted
技术标签:
【中文标题】Boost/Property Tree 确定值类型【英文标题】:Boost/Property Tree determine the value type 【发布时间】:2016-03-28 18:38:34 【问题描述】:我想使用 Boost/Property Tree 作为与我的应用程序的一种同步。 为此,我计划使用 Zeroc/ICE 进行状态同步(使用观察模式和双向连接)。
但是,要以一种有效的方式执行此操作,我需要以某种方式指定应用程序的 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】:属性树的概念提供数据(键值对)的分层存储,其中值是文本。
就是这样。
如果您的应用程序为该文本的内容分配含义,则元数据必须在您的程序中。库中没有变体叶子存储。
即使底层序列化格式(例如 JSON)确实支持它也是如此,因为文档清楚地说明了这一点,例如:
JSON 值映射到包含该值的节点。但是,所有类型信息都丢失了;数字以及文字“null”、“true”和“false”都简单地映射到它们的字符串形式。
现在怎么办?
看起来你想要一个反射风格的框架,而 Boost Property Tree 没有提供它。我建议使用其他库,但所有这些库要么假设侵入性更改,要么仍然需要您手动为程序数据建模元数据。
【讨论】:
有什么可以推荐的库吗?我应该进一步挖掘什么?感谢您的澄清! Qt 有它。原型。我个人喜欢在 Boost Fusion 适应结构之上滚动我自己的基本内容。 Boost Serialization 是一个带有更多代码编写的选项。当然,通过在特征中包含元数据的方法,您可以想象使用 boost 属性树,但您可以将语义信息分层放在它之上以上是关于Boost/Property Tree 确定值类型的主要内容,如果未能解决你的问题,请参考以下文章
如何扩展 boost property_tree 来处理自定义类型?
如何将任何值转换为对象并使用 boost::property_tree json 添加成员
使用 boost::property_tree 读取 ini 文件不适用于 A.x 形式的子级