c ++使用stringstream提升序列化

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字符串传递,因为二进制数据很可能具有嵌入的空值,因此在加载时您的数据将被截断.此外,您的保存功能正在返回指向已销毁对象的数据,从而调用未定义的行为.

  • @ user459811:`std :: string :: size()`无论嵌入的空值如何都是准确的,与`std :: vector <unsigned char> :: size()`完全相同.在任何情况下,如果你真的**想要,给定`std :: string str`,你可以构造一个`std :: vector <unsigned char>`,如下所示:`std :: vector <unsigned char> vec (str.begin(),str.end());`. (2认同)