C++ で階層データ構造をシリアライズしたいと考えています。私が取り組んでいるプロジェクトはブーストを使用しているためboost::property_tree::ptree
、データノード構造として使用しています。
Person
のような低レベルの構造のインスタンスを含む高レベルの構造がありますJob
(各人には仕事があります)。Person
そしてJob
それぞれがメソッドを実装しptreeify
ます。アイデアは、各オブジェクトが含まれている他の各オブジェクトを呼び出すことによって、階層をシリアル化することptreeify
です。結果のサブ オブジェクトのプロパティ ツリーは、それを含むオブジェクトのプロパティ ツリーにノードとして挿入されます。問題は、実際に挿入する方法がわからないことです。
この SO 投稿に従うと、実行時エラーが発生します。何が原因なのかを理解するために必要な知識/経験が不足しています。以下のコードを参照してください。
この非常によく似た質問も見つけましたが、答えがまったくわかりません。使用するとinsert
複雑さが回避されるのではないかと思います。
質問: プロパティ ツリーをノードとして別のプロパティ ツリーに挿入するにはどうすればよいですか?
これが実際のコードです。内で実行時エラーが発生します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");
}