【问题标题】:Network protocol object serialization in C++C++ 中的网络协议对象序列化
【发布时间】:2009-12-06 15:05:56
【问题描述】:

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

class myclass{

...member...

public:

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

}

...这就是我现在所需要的。无论如何,我开始阅读与 ostringstream 相关的文档,结果发现了二进制/文本问题。事实上,它会将换行符转换为每个系统的正确顺序。例如,假设一个成员是指向 const char* foo = "Hello\nMan\n" 的指针,它将在 linux 上以特定字节序列翻译,在 windows 上以另一个字节序列翻译......等等。我的字节将通过互联网发送到一个数据包中,不同的操作系统机器会读取它们,我认为会出现问题......现在我读到我可能会用ostringstream(ios::bin) 初始化ostringstream......它会解决问题吗(前提是我将使用将使用istringstream(ios::bin) 的反序列化函数???我对整个情况感到困惑,如果您可以花一些澄清的行,将不胜感激。

谢谢。

【问题讨论】:

    标签: c++ networking cross-platform stream


    【解决方案1】:

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

    从他们的目标出发:

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

    您也可能对第 4 点和第 5 点感兴趣:

    • 深指针保存和恢复。即指针的保存和恢复保存和恢复指向的数据。
    • 正确恢复指向共享数据的指针。

    【讨论】:

    • 是的,我想我会去提升序列化......我认为这很困难,但在查看教程后,我已经在使用它了。似乎是个不错的选择。谢谢 gf 和 Dirk。
    【解决方案2】:

    第二——使用经过测试的序列化库,如前面提到的Boost::SerializationGoogle Protocol Buffers。这些不应引入进一步的依赖关系。

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

    【讨论】:

      【解决方案3】:

      另一个选项是ACE 框架。它通过 CORBA 编组提供序列化/反序列化(参见类 ACE_InputCDRACE_OutputCDR)。 如果您不了解 ACE,这是一个包含完整 CORBA-Runtime 的巨大框架。但您只需要核心 ACE 库即可进行序列化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        • 2013-12-14
        相关资源
        最近更新 更多