提升属性树值(反)序列化

Posted

技术标签:

【中文标题】提升属性树值(反)序列化【英文标题】:boost property tree value (de-)serialization 【发布时间】:2016-03-30 22:12:16 【问题描述】:

tl;博士 有没有办法覆盖 boost.property_tree 序列化 bool(其他内置)值的方式?

我即将用 boost.property_tree 替换一个自写的键值存储。因此,在第一次运行中,我将实现更改为使用 boost.property_tree,但现在我碰壁了,因为旧实现使用整数 0/1 来表示布尔值,而 property_tree 使用真/假。

所以在序列化 ptree 时,我的文件中会出现真/假字符串。这使得生成的文件不能向后兼容我们软件的旧版本,这是我目前不愿意走的路。

我发现了一篇旧帖子 boost property tree put/get DBL_MAX,它更改了写入/读取双精度值的方法,但是当我尝试对 bool 进行相同操作时,我得到一个编译器错误,该结构已经定义(这是正确的,因为它在ptree_translator.hpp)。

【问题讨论】:

【参考方案1】:

这意味着你不能使用这个机制,因为库已经使用了自定义点。

你可能不需要这个

阅读端好像已经支持旧格式了。所以,你应该很好地阅读旧格式。

您可以使用强 typedef(或自定义枚举,如 Bool my_false_rep, my_true_rep ),可以使用自定义点而不会发生冲突。

【讨论】:

也许我说得不准确。我知道 property_tree 在阅读时可以处理 1/0 真/假。问题是旧的(pre-property_tree)阅读器无法解析真/假,但这就是我在 ptree 序列化 bool 值时总是得到的。因此,一旦文件与新版本一起保存,用户将无法使用我们想要禁止的旧版本软件打开它。带有强类型布尔的提示很好,我只是想知道库是否提供了另一种方式。 没有别的办法。或者更确切地说,所有“其他方式”都意味着使用另一种数据类型而不是bool/或/拼出特殊转换

以上是关于提升属性树值(反)序列化的主要内容,如果未能解决你的问题,请参考以下文章

提升(反)序列化派生对象的向量,使用已删除的函数(unique_ptr)

SharpSerializer:从反序列化中忽略属性/属性

Json.net反序列化不反序列化所有属性

json 从遗留属性名称反序列化

提升序列化:归档“不支持的版本”异常

在 xml 序列化期间忽略属性,但在反序列化期间不忽略