Я пытаюсь отменить сериализацию объекта, переданного через сокет 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;
}





Вы должны отправить содержимое 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, если нет, и это просто пустая строка, вы будете читать пустую строку. Так что десериализация не сработает.
функция send_ boost не принимает параметр размера
Да, я знаю, но send_ принимает указатель на char* в вашем коде, в этом случае размер буфера не может быть выведен. Если бы вы прошли, например, string, проблем не было бы, потому что размер буфера равен string.size(). Самое главное, что теперь ваш код работает :)
Это сработало, большое спасибо. Я использовал отправку таким образом: send(socket, oss.str().c_str());