你如何在C ++中序列化一个对象?

我有一个需要序列化并通过套接字连接进行传输的小对象层次结构。 我需要序列化对象,然后根据它是什么types反序列化它。 有没有一种简单的方法来做到这一点在C + +(如在Java中)?

有没有任何C ++序列化在线代码示例或教程?

编辑:只是要清楚,我正在寻找将对象转换为字节数组,然后回到对象的方法。 我可以处理套接字传输。

谈到序列化,我想起boost序列化API 。 至于通过networking传输序列化的数据,我要么使用伯克利套接字或asio库 。

编辑:
如果你想序列化你的对象到一个字节数组,你可以按照以下的方式使用boost序列化器(来自教程网站):

#include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> class gps_position { private: friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & degrees; ar & minutes; ar & seconds; } int degrees; int minutes; float seconds; public: gps_position(){}; gps_position(int d, int m, float s) : degrees(d), minutes(m), seconds(s) {} }; 

实际的序列化非常简单:

 #include <fstream> std::ofstream ofs("filename.dat", std::ios::binary); // create class instance const gps_position g(35, 59, 24.567f); // save data to archive { boost::archive::binary_oarchive oa(ofs); // write class instance to archive oa << g; // archive and stream closed when destructors are called } 

反序列化以类似的方式工作。

也有机制,让你处理指针的序列化(复杂的数据结构,如发辫等没有问题),派生类,你可以select二进制和文本序列化。 除了所有STL容器都支持开箱即用。

在某些情况下,当处理简单types时,可以这样做:

 object o; socket.write(&o, sizeof(o)); 

作为一个概念validation或初稿,没关系,所以你的团队的其他成员可以继续在其他部分工作。

但迟早, 通常会更快 ,这会让你受伤!

遇到以下问题:

  • 虚拟指针表将被破坏。
  • 指针(数据/成员/函数)将被破坏。
  • 不同机器上填充/alignment的差异。
  • Big / Little-Endian字节sorting问题。
  • float / double的实现变化。

(另外你需要知道你在接收方打开什么东西。)

您可以通过为每个课程开发自己的编组/解组方法来改进。 (理想的是虚拟的,所以它们可以在子类中进行扩展)。一些简单的macros可以让你用大/小端的中立顺序很快写出不同的基本types。

但是那种咕噜的工作要好得多,而且更容易通过boost的序列化库来处理。