2010-07-05 122 views
2

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

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

谢谢。

+0

可能是这个问题的重复? http://stackoverflow.com/questions/1855628/network-protocol-object-serialization-in-c – bjg 2010-07-05 21:24:09

+0

如何在不知道具体要求的情况下确定*最佳*? – 2010-07-06 02:11:13

回答

6

我用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这里),该documentation解释这相当不错。要序列化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; 

注意,当你介绍一个网络,你将使用插座和缓冲区这样做的例子是相当琐碎,很明显。

+0

谢谢你的帮助。我会尝试。 – 2010-07-06 03:13:04

+0

@卢卡斯,当你满意时,你应该接受我们的答案之一,回答你的问题。 – 2010-07-06 11:52:52

1

如果您通过网络传输数据时,我建议使用序列(不XML或类似)的二进制形式。 Qt offers classes for that,它允许您将Qt元系统中已知的任何类传递给数据流。

的问题是,C++真的不支持自省的语言功能,所以你必须要知道这是要序列化的数据。

在许多情况下的长度指示符(使用大端),随后的数据是串行化数据的好方法。