我有一个需要序列化并通过套接字连接传输的小型对象层次结构。我需要序列化对象,然后根据它是什么类型进行反序列化。有没有一种简单的方法来做到这一点在C + +(如在Java中)?如何序列化C++中的对象?
是否有任何C++序列化在线代码示例或教程?
编辑:只是要清楚,我正在寻找方法将对象转换为字节数组,然后回到对象。我可以处理套接字传输。
我有一个需要序列化并通过套接字连接传输的小型对象层次结构。我需要序列化对象,然后根据它是什么类型进行反序列化。有没有一种简单的方法来做到这一点在C + +(如在Java中)?如何序列化C++中的对象?
是否有任何C++序列化在线代码示例或教程?
编辑:只是要清楚,我正在寻找方法将对象转换为字节数组,然后回到对象。我可以处理套接字传输。
谈到序列化,我想起了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容器都支持开箱即用。
在某些情况下,简单类型打交道时,你可以这样做:
object o;
socket.write(&o, sizeof(o));
这是确定作为证据的概念或第一稿,你的团队,以便其他成员可以继续其他工作部分。
但迟早通常更早,这会让你受伤!
您运行与问题:
(加上,你需要知道你是什么拆包到接收端。)
您可以通过制定每类自己编组/解组的方法在此提高。 (理想的是虚拟的,所以它们可以在子类中进行扩展。)几个简单的宏将允许您以大/小端中立的顺序快速写出不同的基本类型。
但是那样的努力工作要好得多,而且更容易通过boost's serialization library来处理。
看看[STLPLUS] [1],lib与持久性实现。 [1]:http://stlplus.sourceforge.net/ – lsalamon 2009-02-09 02:06:50
检出[google :: protobuf](http://code.google.com/p/protobuf/),它是非常强大和快速的二进制序列化库。我们用boost :: asio等成功地使用了它。 – Ketan 2009-02-07 15:28:19
所提供的答案实际上并不能解释*如何序列化。一个提供了boost序列化库,另一个解释了一个天真实现的陷阱。由于这是[tag:C++ - faq]问题,有人可以真正回答吗? – 2016-06-23 20:30:01