C++中的网络协议对象序列化

got*_*ch4 1 c++ networking cross-platform stream

我正在编写一些必须通过TCP/IP发送数据的C++代码.我希望这段代码可以在Linux/Windows/Osx上移植.现在,因为这是我第一次编写便携式网络代码,我基本上需要一些简单的函数来添加到某些对象,如:

class myclass{

...member...

public:

  string serialize(){
    std::ostringstream out();
    out << member1;
    out << member2;
    out << member3;
    return out.str();
  }

}
Run Code Online (Sandbox Code Playgroud)

......这就是我现在所需要的一切.无论如何,我开始阅读ostringstream相关的文档,并结果发现二进制/文本问题.事实上,它会将换行符转换为everysystem的正确顺序.例如,假设一个成员是一个指向const char*foo ="Hello \nMan \n"的指针,它将在linux上以某个字节顺序翻译,另一个在Windows上翻译......依此类推.我的字节将去一个数据包在互联网上,不同的操作系统的机器会读他们,我想麻烦会occurr ......现在我读,我可能会初始化ostringstreamostringstream(ios::bin)...它会解决这个问题(前提是我将使用反序列化功能,将使用istringstream(ios::bin)???我对整个图片感到困惑,如果你可能花费一些澄清线,将非常感激.

谢谢.

Geo*_*che 9

如果有可以构建的Boost.Serialization这样的优秀库,为什么要手动完成呢?

从他们的目标:

数据可移植性 - 在一个平台上创建的字节流应该可以在任何其他平台上读取.

你也感兴趣的可能是第4点和第5点:

  • 深指针保存和恢复.也就是说,保存和恢复指针可以保存和恢复指向的数据.
  • 正确恢复指向共享数据的指针.


Dir*_*tel 8

借调 - 使用经过测试的序列化库,如前面提到的Boost :: SerializationGoogle Protocol Buffers.这些不应该引入进一步的依赖.

如果你对一个全新的框架开放,那么Qt也有Qt Serialization