Повышенная сериализация с ускоренным сокетом не удалась - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь не сериализовать объект, переданный через сокет asio, но у меня ошибка: "завершение вызова после создания экземпляра 'boost :: archive :: archive_exception' what (): ошибка входного потока " когда я пытаюсь получить данные:

на стороне сервера:

int main()
{
...
    std::ostringstream oss;
    Note note(20,20);

    boost::archive::text_oarchive oa(oss);
    oa << note;
    std::cout << (char*)&oa << std::endl;
    send_(socket_, (char *)&oa);
}

клиентская сторона:

int main()
{
...
    boost::asio::read(socket, receive_buffer, boost::asio::transfer_all(), error);

    std::string myString;

    std::istream(&receive_buffer) >> myString;
    std::istringstream iss(myString);
    boost::archive::text_iarchive ia(iss); <--- input stream error
    ia >> note;
    std::cout << note.denominateur << std::endl;
}

1 Ответ

1 голос
/ 22 мая 2019

Вы должны отправить содержимое ostringstream, т.е. строку, которая содержит сериализованный Note.Теперь вы отправляете байты экземпляра text_oarchive, что для меня не имеет смысла.

Может выглядеть так:

  boost::archive::text_oarchive oa(oss);
  oa << note;
  cout << oss.str(); // HERE you get some string which represents serialized Note
  // and content of this string should be sent
  send_(socket_, oss.str().c_str(), oss.str().size());
                 ^^^ content        ^^^ size of content

Ваша функция send_ не принимает параметр размера?Интересно, что для меня этот параметр должен знать, сколько байтов должно быть передано.

Относительно стороны клиента:

// [1]
boost::asio::read(socket, receive_buffer, boost::asio::transfer_all(), error);

, поскольку вы не предоставили MCVE, я предполагаю, что в[1] Строка, которую вы создаете receive_buffer как некий dynamic_buffer , если нет, и это просто пустая строка, вы будете читать пустую строку.Так что десериализация не сработает.

...