用于Linux的C ++对象序列化

我正在做一个需要通过networking发送和接收数据的程序。 我从来没有处理对象序列化。 我参考了关于Boost和Google Protocol Buffers的一些build议。 在Linux中使用哪个是最好的?

如果你知道其他我会感谢你的帮助。

谢谢。

Solutions Collecting From Web of "用于Linux的C ++对象序列化"

我已经使用Boost.Serialization序列化对象并通过套接字传输它们。 这是一个非常灵活的库,如果你有权访问它们,对象可以被侵入序列化

class Foo { public: template<class Archive> void serialize(Archive& ar, const unsigned int version) { ar & _foo; ar & _bar; } int _foo; int _bar; }; 

或者如果您无法访问需要序列化的对象,则是非侵入式的

 namespace boost { namespace serialization { template<class Archive> void serialize(Archive& ar, Foo& f, const unsigned int version) { ar & f._foo; ar & f._bar; } } // namespace serialization } // namespace boost 

如果不暴露其成员( _foo_bar在这里),则有序列化Foo的技巧, 文档解释得非常好。 要序列化Foo ,可以在boost::archive命名空间中使用一个对象:text,binary或xml。

 std::stringstream ss; boost::archive::text_oarchive ar( ss ); Foo foo; foo._foo = 1; foo._bar = 2; ar << foo; 

将存档重建为Foo对象就像这样完成

 boost::archive::text_iarchive ar( ss ); Foo foo ar >> foo; 

注意这个例子是相当微不足道的,显然当你引入一个网络时,你将使用套接字和缓冲区。

如果您通过网络传输数据,我建议使用序列化的二进制形式(不是XML或类似的)。 Qt 为此提供了类 ,它允许您将Qt元系统中已知的任何类传递到数据流中。

问题在于C ++并不真正支持自省作为一种语言功能,因此您必须知道要序列化的数据。

在许多情况下,长度指示符(使用big-endian)后跟数据是序列化数据的好方法。