как использовать boost::serialize::make_binary_object для карты

мое намерение состоит в том, чтобы получить входные данные от map<int,std::string> и создать двоичный архив, который не удается выполнить в приведенном ниже коде, это правильный способ его создания? И как узнать, правильно ли заархивированы данные или нет (десириализация с помощью boost). Мне просто нужно создать boost::archive::binary_iarchive oa(oss,1); и скопировать его в oss?

#include <fstream>
#include <boost/serialization/map.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <string>
#include <iostream>
#include <map>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/serialization.hpp>

using namespace std;

class MyConnections
{
  public:
    MyConnections()
    {

       e_group.insert( std::make_pair(1,"ETOTO") ) ;
       e_group.insert( std::make_pair(2,"ETOTO") ) ;

   }

 template<class archive>
void serialize(archive& ar, const unsigned int version)
{
    using boost::serialization::make_binary_object;
    ar &  boost::serialization::make_binary_object(e_group);
}


  public:
   typedef   map<int,std::string> groups;
   groups  e_group;
};

int main(int argc, char* argv[])
{
    const MyConnections conn;
    stringstream oss(ios_base::out|ios_base::binary);
    boost::archive::binary_oarchive oa(oss,1);
    oa << boost::serialization::make_binary_object(conn)
    std::cout<<oss.str;
}

Ошибка

main.cpp: In member function 'void MyConnections::serialize(archive&, unsigned int)':
main.cpp:29:63: error: cannot convert 'MyConnections::groups {aka std::map<int, std::__cxx11::basic_string<char> >}' to 'void*' for argument '1' to 'const boost::serialization::binary_object boost::serialization::make_binary_object(void*, std::size_t)'
         ar &  boost::serialization::make_binary_object(e_group);
                                                               ^
main.cpp: In function 'int main(int, char**)':
main.cpp:42:55: error: cannot convert 'const MyConnections' to 'void*' for argument '1' to 'const boost::serialization::binary_object boost::serialization::make_binary_object(void*, std::size_t)'
    oa << boost::serialization::make_binary_object(conn)
                                                   ^

person LearningCpp    schedule 28.03.2017    source источник


Ответы (1)


Стандартный вывод не поддерживает случайный двоичный вывод. Вы, вероятно, использовали бы шестнадцатеричное кодирование base64.

Вот упрощенный подход к записи шестнадцатеричных байтов:

#include <sstream>
#include <iostream>
#include <iomanip>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/map.hpp>

using namespace std;

class MyConnections
{
    public:
        MyConnections()
        {

            e_group.insert( std::make_pair(1,"ETOTO") ) ;
            e_group.insert( std::make_pair(2,"ETOTO") ) ;

        }

        template<class archive>
            void serialize(archive& ar, const unsigned int /*version*/) {
                using boost::serialization::make_nvp;
                ar & make_nvp("Connections", e_group);
            }

    public:
        typedef   map<int,std::string> groups;
        groups  e_group;
};

std::string foo() {
    const MyConnections conn;

    stringstream oss(ios_base::out|ios_base::binary);
    boost::archive::binary_oarchive oa(oss);
    oa << boost::serialization::make_nvp("Connections", conn);
    std::string data = oss.str();
    return oss.str();
}

int main()
{
    std::string const data = foo();

    for (uint8_t ch : data) {
        std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(ch) << " ";
    }
}

Отпечатки:

    00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 05 00 00 00 00 00 00 00 45 54 4f 54 4f 02 00 00 00 05 00 00 00 00 00 00 00 45 54 4f 54 4f 

Смотрите Прямой эфир на Coliru

ПРИМЕЧАНИЕ. Я думаю, что параметр ,1 для конструктора архива был странным. Если вы собираетесь передавать флаги, используйте правильные значения перечисления.

person sehe    schedule 28.03.2017
comment
извините за проблемы с пониманием, так как я действительно новичок в этом, не могли бы вы объяснить мне, почему вы не используете make_binary_object здесь, я бы хотел, чтобы все данные карт были частью двоичного объекта, и я также хотел бы десирализовать и посмотреть, если данные верны - person LearningCpp; 28.03.2017
comment
Кроме того, предположим, что одна и та же функция сериализации работает как для двоичного, так и для xml-формата. Могу ли я использовать одну и ту же функцию сериализации как для xml-файла, так и для бианри-файла? - person LearningCpp; 28.03.2017
comment
Да. Вы должны назвать значения (например, make_nvp) для XML, хотя - person sehe; 28.03.2017
comment
Что ж, мое требование состоит в том, чтобы создать двоичный объект и xml, есть ли хороший подход для этого? - person LearningCpp; 28.03.2017
comment
А почему вы не рассмотрели функцию make_binary_object? Это то же самое, что и make_nvp? - person LearningCpp; 28.03.2017
comment
@LearningCpp Я не использую make_binary_object, потому что не вижу необходимости (у вас есть большие двоичные объекты? Я их не вижу). Десериализация — это отдельная задача, какой код вы для этого написали? Я ответил на вопрос как было. Ваши правки изменили/расширили его так сильно, что, вероятно, это должен быть новый вопрос (совет для профессионалов: заполните свой вопрос перед публикацией) - person sehe; 28.03.2017
comment
Вы продолжаете упоминать свои требования как если мы собираемся делать работу. Это ваши требования. Вы можете спросить о конкретных шагах, с которыми вы застряли. - person sehe; 28.03.2017
comment
Да, код является минимальной его частью, размер XML-файла, который создается, на самом деле составляет 2 МБ. - person LearningCpp; 28.03.2017
comment
Нет, моя цель - просто понять хороший подход как для xml, так и для двоичного кода. - person LearningCpp; 28.03.2017
comment
Давайте продолжим обсуждение в чате. - person LearningCpp; 28.03.2017