How to serialize an object to send over network

前端 未结 5 1204
陌清茗
陌清茗 2021-02-15 17:42

I\'m trying to serialize objects to send over network through a socket using only STL. I\'m not finding a way to keep objects\' structure to be deserialized in the other host. I

5条回答
  •  佛祖请我去吃肉
    2021-02-15 18:02

    Serializing C++ Objects over a Network Socket

    This is 6 years late but I just recently had this problem and this was one of the threads that I came across in my search on how to serialize object through a network socket in C++. This solution uses just 2 or 3 lines of code. There are a lot of answers that I found work but the easiest that I found was to use reinterpret_cast(target) to convert the class or structure into an array of characters and feed it through the socket. Here's an example.

    Class to be serialized:

    /* myclass.h */
    
    #ifndef MYCLASS_H
    #define MYCLASS_H
    
    class MyClass
    {
        public:
            int A;
            int B;
            MyClass(){A=1;B=2;}
            ~MyClass(){}
    };
    
    #endif
    

    Server Program:

    /* server.cpp */
    
    #include "myclass.h"
    
    int main (int argc, char** argv)
    {
        // Open socket connection.
        // ...
    
        // Loop continuously until terminated.
        while(1)
        {
            // Read serialized data from socket.
            char buf[sizeof(MyClass)];
            read(newsockfd,buf, sizeof(MyClass));
            MyClass *msg = reinterpret_cast(buf);  
    
            std::cout << "A = " << std::to_string(msg->A) << std::endl;
            std::cout << "B = " << std::to_string(msg->B) << std::endl;
        }
    
        // Close socket connection.
        // ...
    
        return 0;
    }
    

    Client Program:

    /* client.cpp */
    
    #include "myClass.h"
    
    int main(int argc, char *argv[])
    {
        // Open socket connection.
        // ...
    
        while(1)
        {
            printf("Please enter the message: ");
            bzero(buffer,256);
            fgets(buffer,255,stdin);
    
            MyClass msg;
            msg.A = 1;
            msg.B = 2;
    
            // Write serialized data to socket.
            char* tmp = reinterpret_cast(&msg);
            write(sockfd,tmp, sizeof(MyClass));
        }
    
        // Close socket connection.
        // ...
    
        return 0;
    }
    

    Compile both server.cpp and client.cpp using g++ with -std=c++11 as an option. You can then open two terminals and run both programs, however, start the server program before the client so that it has something to connect to.

    Hope this helps.

提交回复
热议问题