加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

boost-propertytree – 我们如何在另一个boost ptree中插入boost

发布时间:2020-12-16 09:45:34 所属栏目:百科 来源:网络整理
导读:我想在C中序列化分层数据结构.我正在研究的项目使用boost,所以我使用boost :: property_tree :: ptree作为我的数据节点结构. 我们有更高级别的结构,比如Person,它包含像Job这样的低级结构实例(每个人都有一份工作). Person和Job各自实现了一个ptreeify方法.
我想在C中序列化分层数据结构.我正在研究的项目使用boost,所以我使用boost :: property_tree :: ptree作为我的数据节点结构.

我们有更高级别的结构,比如Person,它包含像Job这样的低级结构实例(每个人都有一份工作). Person和Job各自实现了一个ptreeify方法.我们的想法是通过让每个对象在它包含的每个其他对象上调用ptreeify来序列化层次结构.然后,生成的子对象的属性树作为节点插入到包含对象的属性树中.问题是我无法弄清楚如何实际插入.

在this SO post之后导致运行时错误.我缺乏了解导致它的原因所需的知识/经验.见下面的代码.

我也找到了this very similar question,但我完全不理解答案,我怀疑插入的使用避免了那里发现的并发症.

问题:如何在另一个属性树中插入属性树作为节点?

这是实际的代码.运行时错误发生在Person :: ptreeify中.

#include <boost/property_tree/json_parser.hpp>
using boost::property_tree::ptree;
using namespace std;

struct Job{
    std::string title;
    int hoursPerWeek;
    ptree ptreeify(void); //return a ptree representing this Job
    };

ptree Job::ptreeify(){
    ptree pt;
    pt.put("title",title);
    pt.put("hours",hoursPerWeek);
    return pt;
    }

struct Person{
    std::string name;
    Job job;
    ptree ptreeify(void); //return a ptree representing this Person
                          //This must iterively call ptreeify on all sub-objects
    void save(const std::string &filename); //write this Person to file
    };

ptree Person::ptreeify(){
    ptree pt;
    pt.put("name",name);
    pt.put("job","");

    ptree jobPt;
    jobPt = job.ptreeify();
    std::cout << "Program dies after this line" << std::endl;
    //This next line causes a run time error
    pt.insert(pt.get_child("job").begin(),jobPt.begin(),jobPt.end());
    return pt;
    }

void Person::save(const std::string &filename){
    ptree pt;
    pt = ptreeify();
    write_json(filename,pt);
    };

int main(){
    Person myPerson;
    myPerson.name = "Julius";

    Job myJob;
    myJob.title = "monkey";
    myJob.hoursPerWeek = 40;

    myPerson.job = myJob;

    myPerson.save("myPerson.dat");
    }

解决方法

事实证明这很简单.你使用put_child

ptree Person::ptreeify(){
    ptree pt;
    pt.put("name",name);

    ptree jobPt;
    jobPt = job.ptreeify();
    pt.put_child("job",jobPt);
    return pt;
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读