use*_*811 10 c++ binary serialization boost
我是boost和c ++的新手,并且正在尝试将对象序列化为二进制,然后对其进行反序列化.
我正在使用示例中的类:http://en.highscore.de/cpp/boost/serialization.html
所以假设这是我尝试序列化的类:
class person
{
public:
person() { }
person(int age) : age_(age) { }
int age() const { return age_; }
private:
friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & age_;
}
int age_;
};
Run Code Online (Sandbox Code Playgroud)
这是序列化代码:
const char * save(Object ss)
{
boost::archive::binary_oarchive oa(ss);
person p(31);
oa << p;
return ss.str().data();
}
Run Code Online (Sandbox Code Playgroud)
这是反序列化代码:
void load(const char * str)
{
stringstream s;
s << str;
boost::archive::binary_iarchive ia(s);
person p;
ia >> p;
std::cout << p.age() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此代码时,收到此错误:
terminate called after throwing an instance of 'boost::archive::archive_exception'
what(): stream error
Run Code Online (Sandbox Code Playgroud)
这让我想问一下,有没有一种正确的方法呢?
谢谢,非常感谢.
编辑:此版本有效:
这是序列化代码:
string save()
{
boost::archive::binary_oarchive oa(ss);
person p(31);
oa << p;
return ss.str();
}
Run Code Online (Sandbox Code Playgroud)
这是反序列化代码:
void load(string str)
{
stringstream s;
s << str;
boost::archive::binary_iarchive ia(s);
person p;
ia >> p;
std::cout << p.age() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:这个版本不起作用.非常感谢对修复的评论.谢谢.
void Serialization::save()
{
stringstream ss;
{
boost::archive::binary_oarchive oa(ss);
person p(31);
oa << p;
}
const char * temp1 = ss.str().data();
stringstream s;
s << temp1;
cout << "UNSERIALIZING\n";
boost::archive::binary_iarchive ia(s);
person p1;
ia >> p1;
std::cout << p1.age() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
ild*_*arn 11
std::stringstream允许使用二进制存档,因为任何字符都可以存储在std::stringstream/中std::string.
问题是将结果数据作为空终止的C字符串传递,因为二进制数据很可能具有嵌入的空值,因此在加载时您的数据将被截断.此外,您的保存功能正在返回指向已销毁对象的数据,从而调用未定义的行为.
| 归档时间: |
|
| 查看次数: |
15953 次 |
| 最近记录: |