客户端-服务器架构中的序列化和反序列化

Serializing and Deserializing in a client-server architecture

我正在使用 cereal 在 C++ 中序列化和反序列化数据,我遇到了一个问题。我正在使用套接字向客户端发送数据,因此我以 JSON 格式发送带有序列化文件的字符串流。 问题是我不能在客户端用简单的数据类型或复杂的数据类型反序列化它,因为它没有通过 rapidjson 检查,它告诉我它不是一个对象

考虑到我无法从服务器端创建 class 的实例,反序列化数据的正确方法是什么?

这是一个简单的例子,我尝试将用户的用户名发送到客户端

发送函数:

void DBUser::SendUser()
{
    std::stringstream os;
    {
        cereal::JSONOutputArchive archive_out(os);
        archive_out(CEREAL_NVP(m_user));
    }
    ServerSocket* instance= ServerSocket::GetInstance();
    instance->SendData(os.str());
}

如果需要,这里是用于将字符串流发送到客户端的函数

void ServerSocket::SendData(std::string message)
{
    try {
        asio::error_code ignored_error;
        asio::write(*socket, asio::buffer(message), ignored_error);
    }
    catch (std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }
}

这是我尝试反序列化时的代码:

std::array<char, 5000> buf;
asio::error_code error;
size_t len = socket.read_some(asio::buffer(buf), error);
std::string testString;
std::stringstream is(buf.data());
{
    cereal::JSONInputArchive archive_in(is);
    archive_in(testString);
}
std::cout << "Message from server: ";
std::cout << testString;
std::cout << std::endl;

您需要对接收到的套接字数据进行空终止。在这个 size_t len = socket.read_some(asio::buffer(buf), error); 语句之后,你能尝试像 buf[len] = '[=10=]'; 那样用 null 终止它吗?