C ++ увеличить сериализацию с помощью stringstream - PullRequest
10 голосов
/ 04 марта 2011

Я новичок в 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_;
}; 

Это код сериализации:

const char * save(Object ss)
{
    boost::archive::binary_oarchive oa(ss);
    person p(31);
    oa << p;

    return ss.str().data();
}

Это код десериализации:

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;

    }

Когда я пытаюсь запустить этот код, я получаю эту ошибку:

terminate called after throwing an instance of 'boost::archive::archive_exception'
  what():  stream error

Что заставляет меня спросить, есть ли правильный способ сделать это?

Спасибо, высоко ценится.

РЕДАКТИРОВАТЬ: Эта версия работает:

Это код сериализации:

string save()
{
    boost::archive::binary_oarchive oa(ss);
    person p(31);
    oa << p;

    return ss.str();
}

Это код десериализации:

void load(string str)
    {

        stringstream s;
        s << str;

        boost::archive::binary_iarchive ia(s);
        person p;
        ia >> p;
        std::cout << p.age() << std::endl;

    }

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;

}

Ответы [ 2 ]

11 голосов
/ 04 марта 2011

Использование двоичных архивов с std::stringstream разрешено, так как любой символ может быть сохранен в std::stringstream / std::string.

Проблема заключается в передаче результирующих данных в виде C-строки с нулевым символом в конце, поскольку весьма вероятно, что двоичные данные имеют встроенные нули, поэтому при загрузке ваши данные будут усечены. Кроме того, функция сохранения возвращает данные, указывающие на разрушенный объект, вызывая неопределенное поведение .

0 голосов
/ 04 марта 2011

Вы не можете использовать binary_iarchive / binary_oarchive со строковым потоком, потому что некоторые «двоичные» символы НЕ допускаются внутри «строки». Если вы хотите использовать stringstream, вам нужны 'text_iarchive / text_oarchive' или 'xml_iarchive / xml_oarchive'.

При использовании «binary_ {io} archive» (производительность) вы должны использовать «fstream».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...