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位集
    我最近展示了两个版本:

    • 非侵入式(效率稍低):
    • ;这实际上很有趣,因为它是“混合的”。唯一的干扰位是两行代码:

      // forward declaration for optional zero-copy serialization support 
      class serialize_impl; 
      friend class serialize_impl;
      
      实现的其余部分可以隐藏在TU中,并且只有在需要依赖Boost序列化的情况下才进行编译

用getter序列化 关于建议的说明:

[…]您可以创建该值的临时副本并序列化:–m.s

不要这样做!至少您需要单独的加载/保存处理。但实际上,只需使用上面显示的最后一种方法,
serialize\u impl
具有对类实现的完全友好访问权


如果你真的不能,你可以使用
load/save
或者
load\uu/save\u construct\u data
,如果你的类型不是默认可构造的

这对简单的Point2d类很好。但是对于以下类也有解决方案:@Anonymous为什么会有所不同?使用
ar&b.value()
我遇到两个编译器错误。第一个错误:“C2679:二进制运算符'&”:找不到接受“double”的运算符。第二个错误:“C2088:'&”:对于类无效(由于我使用另一种语言,因此粗略翻译)@匿名
运算符&
希望其参数通过非常量引用传递,这对于函数
value()的临时返回值是不可能的
。您可以创建该值的临时副本并序列化:@m.s。该建议不起作用。除非您永远不想反序列化。序列化框架需要/假定左值是有原因的。