【问题标题】:How to write a boost serialization wrapper for existing class types如何为现有的类类型编写 boost 序列化包装器
【发布时间】:2015-07-01 11:22:54
【问题描述】:

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

#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 分别编写类似的方法,以及其他无法自行修改的类类型?

【问题讨论】:

    标签: c++ serialization boost


    【解决方案1】:

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

    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
    

    【讨论】:

    • 这适用于简单的 Point2d 类。但是下面的类是否也有解决方案:codepad.org/1Qp1qSuK
    • @Anonymous 为什么会有不同?使用ar &amp; b.value()
    • 我得到两个编译器错误。第一:“C2679:二元运算符'&':找不到接受'double'的运算符”。第二个错误:“C2088: '&': Invalid for class”(粗略翻译,因为我使用的是另一种语言)
    • @Anonymous operator&amp; 希望其参数通过非常量引用传递,这对于函数 value() 的临时返回值是不可能的。您可以创建该值的临时副本并将其序列化:melpon.org/wandbox/permlink/CD6Iyh1tXse9bTOC
    • @m.s.该建议不起作用。除非你永远不想反序列化。序列化框架需要/假定左值是有原因的。
    【解决方案2】:

    除了其他答案

    一般序列化类型族

    如果您想以通用方式非侵入式地为点实现 serialize,对于具有一些共同特征的通用类型“家族”,请查看此处,例如

    用 getter 序列化

    关于建议的说明:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多