使用升压套接字升压序列化失败
Boost serialization with boost socket fails
我正在尝试反序列化通过 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,如果没有,则它只是空字符串,您将读取空字符串。所以反序列化是行不通的。
我正在尝试反序列化通过 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,如果没有,则它只是空字符串,您将读取空字符串。所以反序列化是行不通的。