如何为现有类类型编写boost序列化包装器

时间:2015-07-01 11:22:55

标签: c++ serialization boost

我有自己的类,包含以下数据:

#include <boost/date_time/posix_time/time_serialize.hpp> 
#include <boost/serialization/vector.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
using namespace boost::archive;

class Foo {
// [...]

unsigned int m_length;  
std::vector<boost::posix_time::ptime> m_vecTimestamps;
std::vector<double> m_vecA;
std::vector<double> m_vecB;
std::vector<Point2d> m_vecPos;

由于我包含了相应的标题,我甚至能够序列化ptime:

// Still class Foo
private:
    friend class boost::serialization::access;

    template <typename Archive>
    void serialize(Archive &ar, const unsigned int version) { 
        ar & m_length; 
        ar & m_vecTimestamps; 
        ar & m_vecA;
        ar & m_vecB;
        ar & m_vecPos; // ooops, error
    }

嗯,没有方法可以序列化Point2d,因为这个类是由另一个第三方库提供的(只包含2个双精度值)。那么我可以选择编写一个可以在Foo :: serialize中使用的包装器?我也想轻松读取和写入该向量。一个简单的例子就是很好。

我试着看看time_serialize.hpp,但我不明白如何为Point2d分别编写一个类似的方法,这些方法不能被我自己修改?

2 个答案:

答案 0 :(得分:1)

boost序列化教程包含intrusivenon-intrusive示例。您需要非侵入式版本,以便为aoColumns添加serialize函数:

Point2d

答案 1 :(得分:1)

除了其他答案

通常序列化类型族

如果你想以通用的方式非侵入地实现serialize点,对于具有一些共同特征的泛型类型的“族”,请看这里。

使用getter进行序列化

关于建议的说明:

  

[...]您可以创建值的临时副本并序列化: - m.s. 54 mins ago

不要那样做!至少你需要单独的加载/保存处理。但实际上,只需使用上面显示的最后一种方法,其中serialize_impl具有完全朋友对类实现的访问权。

如果你真的不能,你可以使用load/save,可能load_/save_construct_data,以防你的类型不是默认构造