0

我正在编写一个执行 IPC 的实现。用户拨打电话,我将所有这些参数传递给其他进程。

我已经为此类功能编写了一个基于逻辑的自动代码生成器,其工作原理如下:

  1. 获取所有参数并将它们放入结构中。
  2. 添加 IPC 所需的其他信息。将此结构的大小和指针传递给 POSIX 消息队列。从这个地址读取数据,直到指定的大小,被读取并发送到其他进程。
  3. 解构结构以获取参数。
  4. 使用这些参数调用实际函数。

当我只有普通的旧数据类型时,这工作得很好。但是当函数参数是非 POD 时,我的逻辑失败了,因为:

  1. 在非 POD 类型的情况下,我无法真正说出总数据的大小 [消息队列需要]
  2. 某些类可能包含动态增加的实体,例如向量。

有人可以告诉我如何处理这种情况吗?

4

1 回答 1

1

您需要决定如何进行序列化。

例如,您可以定义一个表示各方之间交换的消息的类型,然后实现一个将对象序列化为消息的通用函数。当您有自定义逻辑时,您可以专门化序列化功能。

这是一些伪代码:

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可序列化类型上的方法对其进行抽象)

于 2013-03-08T13:10:29.747 回答