我正在尝试通过命名管道发送一个对象但是,我不明白如何序列化我的对象:
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序列化)
我试图将对象的数据放在一个结构中,但我没有设法通过命名管道发送它......可能是因为向量
请有人与我分享他的知识
答案 0 :(得分:2)
您需要将结构转换为可以放入单个字节数组的内容,这些字节数组可以作为内存块写入管道。字符串是最简单的例子。
将数据格式化为字符串的简单(但不灵活)方法是使用C ++字符串流写入类型,然后使用换行符,然后在fileList中写入第一个条目,然后是换行符,然后是第二个条目当管道的远端接收到这个数据时,它必须从字符串中读取第一行,将其解析为类型,然后读取每个下一行并将它们添加到文件列表中。 (如果您的命名管道是跨网络的,您可能希望将数据编码为utf-8以避免字符集问题。)
实际上,您需要一种更灵活的文件格式来标记值。常见的解决方案是JSON,它可以编码多个结构,向量,布尔值,整数,双精度值和其他值。 JSON总是utf-8,可以处理嵌套结构。 C ++不是使用JSON最简单的语言,但它比滚动自己的解决方案更好。一个可以读写JSON数据的库是{{3}}。
序列化格式的高端是二进制编码,解析比基于字符串的数据快得多。但是,二进制数据不是人类可读的,因此调试起来会更困难。进行二进制编码/解码的库的一个例子是https://github.com/open-source-parsers/jsoncpp的Cap'n Proto。