我有自己的类,包含以下数据:
#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分别编写一个类似的方法,这些方法不能被我自己修改?
答案 0 :(得分:1)
boost序列化教程包含intrusive和non-intrusive示例。您需要非侵入式版本,以便为aoColumns
添加serialize
函数:
Point2d
答案 1 :(得分:1)
除了其他答案
如果你想以通用的方式非侵入地实现serialize
点,对于具有一些共同特征的泛型类型的“族”,请看这里。
对于dynamic_bitset
我最近展示了两个版本:
How to serialize boost::dynamic_bitset?;这实际上很有趣,因为它是“混合”。唯一的侵入式位是两行代码:
// forward declaration for optional zero-copy serialization support
class serialize_impl;
friend class serialize_impl;
其余的实现可以隐藏在TU中,只有在需要依赖Boost Serialization时才会编译。
关于建议的说明:
[...]您可以创建值的临时副本并序列化: - m.s. 54 mins ago
不要那样做!至少你需要单独的加载/保存处理。但实际上,只需使用上面显示的最后一种方法,其中serialize_impl
具有完全朋友对类实现的访问权。
如果你真的不能,你可以使用load/save
,可能load_/save_construct_data
,以防你的类型不是默认构造