C++ 如何为现有类类型编写boost序列化包装器
我有自己的类,包含以下数据:C++ 如何为现有类类型编写boost序列化包装器,c++,serialization,boost,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
#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;
#包括
#包括
#包括
#包括
使用名称空间boost::archive;
福班{
// [...]
无符号整数m_长度;
std::向量mu向量时间戳;
std::向量m_vecA;
std::向量m_vecB;
std::向量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
}
//仍然是类Foo
私人:
好友类boost::serialization::access;
模板
void序列化(存档&ar,常量unsigned int version){
ar&m_长度;
ar&m_向量时间戳;
ar&mèvecA;
ar&m_vecB;
ar&m_vecPos;//oops,错误
}
好的,没有序列化Point2d的方法,因为这个类是由另一个第三方库(只包含2个双值)提供的。那么,我可以选择哪些选项来编写一个可以在Foo::serialize中使用的包装器呢?我也想轻松地读写这个向量。举个简单的例子就好了
我试图查看time_serialize.hpp,但我不明白如何分别为Point2d和其他无法修改的类类型编写类似的方法?boost serialization教程包含一个和一个示例。您需要一个非侵入性版本,该版本允许您添加一个
serialize
函数对于点2D
:
namespace boost {
namespace serialization {
template<class Archive>
void serialize(Archive & ar, Point2d & p, const unsigned int version)
{
ar & p.x;
ar & p.y;
}
} // namespace serialization
} // namespace boost
namespace boost{
命名空间序列化{
模板
无效序列化(存档和ar、点2D和p、常量未签名整数版本)
{
ar&p.x;
ar&p.y;
}
}//命名空间序列化
}//名称空间提升
除了另一个答案之外
泛型序列化类型族
如果您想要以非侵入式方式实现点的序列化
,对于具有一些常见特征的泛型类型的“家族”,请查看此处,例如
- (它使用二进制序列化来完成繁重的工作)
- 对于
我最近展示了两个版本:动态\u位集
- 非侵入式(效率稍低):
- ;这实际上很有趣,因为它是“混合的”。唯一的干扰位是两行代码:
实现的其余部分可以隐藏在TU中,并且只有在需要依赖Boost序列化的情况下才进行编译// forward declaration for optional zero-copy serialization support class serialize_impl; friend class serialize_impl;
serialize\u impl
具有对类实现的完全友好访问权
如果你真的不能,你可以使用
load/save
或者load\uu/save\u construct\u data
,如果你的类型不是默认可构造的这对简单的Point2d类很好。但是对于以下类也有解决方案:@Anonymous为什么会有所不同?使用ar&b.value()
我遇到两个编译器错误。第一个错误:“C2679:二进制运算符'&”:找不到接受“double”的运算符。第二个错误:“C2088:'&”:对于类无效(由于我使用另一种语言,因此粗略翻译)@匿名运算符&
希望其参数通过非常量引用传递,这对于函数value()的临时返回值是不可能的
。您可以创建该值的临时副本并序列化:@m.s。该建议不起作用。除非您永远不想反序列化。序列化框架需要/假定左值是有原因的。