【问题标题】:C++ send objects in named pipe [closed]C ++在命名管道中发送对象[关闭]
【发布时间】:2016-08-14 21:48:48
【问题描述】:

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

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 序列化)

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

有人可以和我分享他的知识吗

【问题讨论】:

  • 在 C++ 中,结构与类非常相似。
  • std::vector 和 std::list 和 std::string 都有指针。换句话说,要传输其中任何一个的内容,您必须“消除”指针,并且只发送数据。有很多方法可以做到。研究术语“持久存储”。
  • 您需要为此进行序列化。您需要编写代码或使用现有框架来(反)序列化(反)字节流中的对象。
  • 也许与 std::bitset ? ;)

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


【解决方案1】:

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

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

实际上,您需要一种更灵活的文件格式来标记值。一个常见的解决方案是 JSON,它可以编码多个结构、向量、boolean、int、double 和其他值。 JSON 总是 utf-8 并且可以处理嵌套结构。 C++ 不是使用 JSON 的最简单语言,但它比滚动您自己的解决方案要好。一个可以读写 JSON 数据的库是https://github.com/open-source-parsers/jsoncpp

序列化格式的高端是二进制编码,它比基于字符串的数据解析快得多。但是,二进制数据不是人类可读的,因此可能更难以调试。进行二进制编码/解码的库的一个示例是位于https://capnproto.org/ 的 Cap'n Proto。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多