Упакуйте указатель объекта класса в char * для очереди сообщений - PullRequest
2 голосов
/ 22 октября 2011

Можно ли правильно и безопасно передать указатель на объект класса через очередь сообщений POSIX?

Например,

Object *obj = new Object();

mq_send(mqdes, static_cast<char*>&obj, sizeof(obj), 1);

и на принимающей стороне выполнить reinterpret_castвернуться к моей Object?

Поскольку очереди сообщений используют файловый дескриптор в Linux, мне интересно, как это работает.Я попытался это безуспешно, но думаю, что я могу делать что-то не так.

1 Ответ

3 голосов
/ 22 октября 2011

Не совсем ... только если объект содержит только поля базового типа и другие структуры с полями базового типа. Если вы отправите указатель, его нельзя будет повторно использовать с другой стороны, если он находится в другом процессе или в другой системе.

Также используя классы с наследованием и виртуальные методы, это может быть беспорядок!

Лучше добавить метод Serialize с моей точки зрения.

Также передача сериализованного таким образом двоичного файла структуры вообще не переносима и может привести к нескольким проблемам, если вы захотите использовать тот же механизм с другими системами или если вы измените структуру или такие вещи, как упаковка объекта.

Пользовательская сериализация \ десериализация предпочтительнее и более переносима, но, конечно, выбор за вами.

Что-то вроде ...

template<typename T>
int SerializeAndSendObject(mqd_t mqdes, const T* instance)
{
    MySerializationStream stream;
    instance->SerializeTo(stream);
    mq_send(stream.toBuffer(), stream.size());
}

Если вы просто отправляете между двумя потоками, а не отправляете содержимое объекта, я отправляю только указатель на объект, выделенный с новым, и я освобождаю его с другой стороны. Будьте осторожны, когда вы располагаете очередь, вы должны сначала уничтожить все ожидающие объекты!

Object* pointer = &obj;
mq_send(mqdes, static_cast<char*>(pointer), sizeof(Object*), 1);

Обратите внимание на sizeof (Object *) ... вам нужно отправить только указатель, а не сам объект.

...