2009-02-07 41 views
75

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

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

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

+0

看看[STLPLUS] [1],lib与持久性实现。 [1]:http://stlplus.sourceforge.net/ – lsalamon 2009-02-09 02:06:50

+2

检出[google :: protobuf](http://code.google.com/p/protobuf/),它是非常强大和快速的二进制序列化库。我们用boost :: asio等成功地使用了它。 – Ketan 2009-02-07 15:28:19

+2

所提供的答案实际上并不能解释*如何序列化。一个提供了boost序列化库,另一个解释了一个天真实现的陷阱。由于这是[tag:C++ - faq]问题,有人可以真正回答吗? – 2016-06-23 20:30:01

回答

50

谈到序列化,我想起了boost serialization API。至于通过网络传输序列化数据,我要么使用Berkeley套接字,要么使用asio library

编辑:
如果你想序列的对象为一个字节数组,你可以使用以下方式提升串行器(从教程网站获取):

#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 
    } 

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

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

13

在某些情况下,简单类型打交道时,你可以这样做:

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

这是确定作为证据的概念或第一稿,你的团队,以便其他成员可以继续其他工作部分。

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

您运行与问题:

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

(加上,你需要知道你是什么拆包到接收端。)

您可以通过制定每类自己编组/解组的方法在此提高。 (理想的是虚拟的,所以它们可以在子类中进行扩展。)几个简单的宏将允许您以大/小端中立的顺序快速写出不同的基本类型。

但是那样的努力工作要好得多,而且更容易通过boost's serialization library来处理。