通过IPC传递非PODs [Plain old DataTypes]
Passing non PODs [ Plain old DataTypes ] over IPC
我正在写一个实现做IPC。用户做一个调用,我把所有这些参数传递给其他进程。
我已经为这些基于逻辑的函数编写了一个自动代码生成器,其工作原理如下:
- 获取所有参数并将它们放入一个结构中。
- 添加IPC所需的其他信息。将该结构体的大小和指针传递给POSIX消息队列。从该地址读取数据,直到指定的大小,并发送给其他进程。
- 反构造结构来获取参数。
- 使用这些参数调用实际函数
当我只有普通的旧数据类型时,这工作得很好。但是当函数参数是非pod时,我的逻辑失败了,因为:
- 我真的不能告诉总数据的大小,在非pod类型的情况下[消息队列所需]
- 一些类可能包含动态增加的实体,如向量。
谁能给我一个主意,我该如何处理这种情况?
您需要决定如何进行序列化。
。您可以定义一个类型来表示在各方之间交换的消息,然后实现一个将对象序列化为消息的泛型函数。当你有自定义逻辑时,你专门化序列化函数。
下面是一些伪代码:
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
方法对可序列化类型进行抽象)
相关文章:
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- Old C++ DLLs into C#
- QT应用程序在BuildBot上构建后变为Windows Old
- 为什么使用统一初始值设定项语法会导致与"old"样式 () 不同的行为?
- "uses of target_link_libraries must be either all-keyword or all-plain"
- 构造字符串( "Plain Old C chain" ) 是右值吗?
- Qt4.8.6中的Qt::escape(const QString & plain)在哪里?
- 将类成员绑定到plain-C函数指针
- "C2447: '{' : missing function header (old-style formal list?)"是什么意思?
- old的-u选项是如何工作的,它什么时候有用
- “plain/text”encodedData和QDataStream到可读的QString
- 提高"too old"热情,不会安装
- 预测 2.6.16 和 2.6.26 内核版本之间的"kernel too old"错误
- 通过IPC传递非PODs [Plain old DataTypes]
- old option -lrt指的是哪个库(Bionic libc)
- 在同一个可执行文件中使用C/ c++进行不同的优化(plain、SSE、AVX)
- 我如何从模板参数中提取value_type (std::vector和plain pointer)
- Win32 C++ "Old Bitmap"可以重复使用吗?