【发布时间】:2018-07-20 00:26:58
【问题描述】:
假设我有一个类型为 Animal 的对象,我将其序列化。
在下面的例子中,要序列化的内容是
22 serialization::archive 16 0 0 4 1 5 Horse
很好。但是,如果我需要将其序列化为json 怎么办?是否可以通过boost序列化?
我在找这样一个字符串:
{
"legs": 4,
"is_mammal": true,
"name": "Horse"
}
代码:
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <iostream>
#include <sstream>
using namespace boost::archive;
class Animal
{
public:
Animal(){}
void set_leg(int l){legs=l;};
void set_name(std::string s){name=s;};
void set_ismammal(bool b){is_mammal=b;};
void print();
private:
friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & legs;
ar & is_mammal;
ar & name;
}
int legs;
bool is_mammal;
std::string name;
};
void Animal::print()
{
std::cout
<<name<<" with "
<<legs<<" legs is "
<<(is_mammal?"":"not ")
<<"a mammal"<<std::endl;
}
void save_obj(const Animal &animal,std::stringstream &stream)
{
text_oarchive oa{stream};
oa << animal;
}
void load_obj(std::stringstream &stream,Animal &animal)
{
text_iarchive ia{stream};
ia >> animal;
}
int main()
{
std::stringstream stream;
Animal animal;
animal.set_name("Horse");
animal.set_leg(4);
animal.set_ismammal(true);
save_obj(animal,stream);
Animal duplicate;
load_obj(stream,duplicate);
std::cout<<"object print: ";
duplicate.print();
std::cout<<"stream print: "<<stream.str()<<std::endl;
}
// g++ -std=c++11 main.cpp -lboost_serialization && ./a.out
结果
object print: Horse with 4 legs is a mammal
stream print: 22 serialization::archive 16 0 0 4 1 5 Horse
【问题讨论】:
-
看一下:boost::property_tree::write_json
-
@FrankS101,经常使用它。但是如何连接到
Archive? -
有人应该为 Boost.Serialization 编写一个与 Boost.PropertyTree 兼容的存档。问题是编写一个完整的 Boost.Serialization 归档文件非常痛苦。
标签: c++ json serialization boost