Home > database >  Serializing and Deserializing in a client-server architecture
Serializing and Deserializing in a client-server architecture

Time:12-05

I'm using cereal to serialize and deserialize data in c , and I came upon a problem. I'm sending data using a socket to the client side, so i send a stringstream with the serialized files in a JSON format. The problem is that I can't deserialize it with simple data types, nor with complex ones, on the client side as it fails a rapidjson check and it tells me it's not an object

Here is the error

What would be the proper way of deserializing data considering that i can't create an instance of a class from the server side ?

Here is a simple example in which i try to send the username of a user to the client side

The send function :

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());
}

In case it is needed, here is the function used to send the stringstream to the client side

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;
    }
}

And here is the code when i try to deserialize:

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;

CodePudding user response:

You need to null terminate the received socket data. Can you try null terminating it like buf[len] = '\0'; after this size_t len = socket.read_some(asio::buffer(buf), error); statement.

  • Related