序列化客户端和服务器之间的复杂C ++结构

时间:2019-01-05 15:15:15

标签: c++ serialization protocol-buffers zeromq

我正在为同一平台编写C ++ ZeroMQ客户端和服务器程序。我需要使用服务器上的参数来触发某些功能。参数是复杂的结构。我才刚开始尝试这个。我正在尝试填充结构并将其填充到char *缓冲区中,以查看是否按照结构顺序填充了字节。

但是当我尝试打印缓冲区时,它会打印垃圾。请告知可能出什么问题。这是执行此操作的优雅方法吗?我不能使用gRPC或Protobuffs,因为该消息包含复杂的结构。

    struct employee {
    uint8_t byt;
    int arr[10] = {0};
    int number;
    uint32_t acct;
};

int main ()
{
    //  Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_PAIR);
    struct employee *e = new employee;
    e->byt = 0xff;
    e->arr[0] = 15;
    e->number = 25555;
    e->acct = 45;

    std::cout << "Connecting to hello world server…" << std::endl;
    socket.connect ("tcp://localhost:5555");

    char *temp = (char*)malloc(sizeof(employee));
    memcpy(temp,e,sizeof(employee));

    zmq::message_t request(sizeof(employee));
    char *temp1 = temp;
    for (int i = 0;i<sizeof(employee);i++) {
        std::cout<<temp1[i]<<std::endl;
    }
    memcpy ((void *)request.data(),(void*)temp, sizeof(employee));
    socket.send (request);

    //  Get the reply.
    zmq::message_t reply;
    socket.recv (&reply);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

我想在这里分享两点。

  1. 缓冲区(temp)包含数据结构的二进制表示形式。如果要检查内容是否有意义,可以将指针类型转换回其原始指针。即:

结构员工* employeePtr = static_cast <结构员工*>(temp);

cout << employeePtr-> number;

...

  1. 当您尝试对对象进行反序列化时,可以 序列化占用连续的内存。否则,您将不得不以其他方式处理它们(例如,使用流)。此类情况的示例包括:

    • 当您拥有指向某些已分配内存的指针,shared_ptr等时

    • 容器类