C ++在命名管道中发送对象

时间:2016-04-21 15:19:10

标签: c++ oop object serialization named-pipes

我正在尝试通过命名管道发送一个对象但是,我不明白如何序列化我的对象:

class Order {
public:
  void                          addFile(std::string const &file);
  void                          setType(Parser::Information const &type);
  std::list<std::string>        getFileList() const;
  Parser::Information           getType() const;
  void                          clear();

private:
  std::vector<std::string>      fileList;
  Parser::Information           type;
};

我已经设法使我的命名管道使用基本数据类型,但是,我不了解如何发送和接收完整对象(不使用boost序列化)

我试图将对象的数据放在一个结构中,但我没有设法通过命名管道发送它......可能是因为向量

请有人与我分享他的知识

1 个答案:

答案 0 :(得分:2)

您需要将结构转换为可以放入单个字节数组的内容,这些字节数组可以作为内存块写入管道。字符串是最简单的例子。

将数据格式化为字符串的简单(但不灵活)方法是使用C ++字符串流写入类型,然后使用换行符,然后在fileList中写入第一个条目,然后是换行符,然后是第二个条目当管道的远端接收到这个数据时,它必须从字符串中读取第一行,将其解析为类型,然后读取每个下一行并将它们添加到文件列表中。 (如果您的命名管道是跨网络的,您可能希望将数据编码为utf-8以避免字符集问题。)

实际上,您需要一种更灵活的文件格式来标记值。常见的解决方案是JSON,它可以编码多个结构,向量,布尔值,整数,双精度值和其他值。 JSON总是utf-8,可以处理嵌套结构。 C ++不是使用JSON最简单的语言,但它比滚动自己的解决方案更好。一个可以读写JSON数据的库是{​​{3}}。

序列化格式的高端是二进制编码,解析比基于字符串的数据快得多。但是,二进制数据不是人类可读的,因此调试起来会更困难。进行二进制编码/解码的库的一个例子是https://github.com/open-source-parsers/jsoncpp的Cap'n Proto。