сериализовать сложные структуры C ++ между клиентом и сервером - PullRequest
0 голосов
/ 05 января 2019

Я пишу клиентские и серверные программы на 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 голосов
/ 05 января 2019

Два момента, которыми я хотел бы поделиться здесь.

  1. буфер (temp) содержит двоичное представление вашей структуры данных. Если вы хотите проверить, является ли содержимое значимым, вы можете привести тип указателя обратно к его исходному указателю .ie:

struct employee * employeePtr = static_cast (temp);

cout << employeePtr -> number;

...

  1. То, как вы десериализуете, хорошо, когда объект, который вы пытаетесь Сериализация занимает непрерывную память. Когда это не так, вам придется обрабатывать их другим способом (например, с помощью stream). Примеры таких случаев включают:

    • когда у вас есть указатель, shared_ptr и т. Д. Для некоторой выделенной памяти

    • контейнерные классы

...