Передача не POD [Plain old DataTypes] через IPC

Я пишу реализацию для выполнения IPC. Пользователь делает вызов, я беру все эти параметры и передаю их другому процессу.

Я написал автоматический генератор кода для таких функций на основе логики, который работает примерно так:

  1. Возьмите все параметры и поместите их в структуру.
  2. Добавьте другую информацию, необходимую для IPC. Передайте размер и указатель этой структуры в очередь сообщений POSIX. Данные с этого адреса, до указанного размера, считываются и отправляются в другой процесс.
  3. Разобрать структуру, чтобы получить параметры.
  4. Вызовите реальную функцию с этими параметрами.

Это прекрасно работает, когда у меня есть только простые старые типы данных. Но когда параметры функции не POD, моя логика не работает, потому что:

  1. Я не могу действительно сказать размер общих данных в случае не POD типа [Требуется очередями сообщений]
  2. Некоторые классы могут содержать динамически увеличивающиеся объекты, такие как векторы.

Может кто-нибудь подсказать, как я могу подойти к этой ситуации?

0

Решение

Вам нужно решить, как сделать сериализацию.

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

вот какой-то псевдокод:

class Message {...} // blah blah

// default imple
template<typename T>
Message& operator <<(Message& msg, T& t) { .. write it as a POD .. }

// specialize for types which need custom logic
Message& operator <<(Message& msg, SomeCustomType& x) { .. custom serialization ..}

Для десериализации нужно сделать подобное для operator >>, Тогда вы делаете:

Message msg;
MyType whatever = ...
msg << whatever;
// now send msg to other side.

Конечно, вам понадобятся некоторые метаданные в сообщении, чтобы вы знали, как распаковать на другой стороне (т.е. к какому типу).

Существует множество примеров (например, потоки STL или как MFC абстрагирует их с помощью класса CArchive и Serialize метод на сериализуемых типах)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]