boost::chrono::timepoint类型的序列化无法工作

3

我正在尝试序列化boost::chrono::time_point tp类型的结构体成员,但是出现了“serialize不是boost::chrono::time_point的成员”的错误,以下是我的代码:

 struct myTimestamp
      {
          boost::chrono::time_point<boost::chrono::high_resolution_clock>  begin1;
          boost::chrono::time_point<boost::chrono::high_resolution_clock>  end1;

      private:
         friend class boost::serialization::access;
         template<class Archive>
         void serialize(Archive &ar, const unsigned int version)
         {
            ar & begin1;
            ar & end1;   
         }        

      public:
          myTimestamp();    
          virtual  ~myTimestamp();
      };

我已经包含了所有必需的头文件,但问题仍然存在。
我甚至在序列化方法中尝试了下面的选项.. 但仍然是同样的问题
ar & boost::serialization::make_binary_object(&begin1, sizeof(begin1)); ar & boost::serialization::make_binary_object(&end1, sizeof(end1));

难道不是 boost::chrono::time_point 吗? - eerorika
@user2079303 - 是的,它是 boost::chrono::time_point。 - user3295725
@user2079303 您的回答是解决此问题的好提示。不幸的是,我没有找到另一个描述这个的答案。我会在有时间的时候写点东西。 - sehe
@sehe,比我的答案更好(可重用)的方法是为time_point<high_resolution_clock>定义一个自由的serialize函数,但我无法弄清楚如何访问time_point内部的lvalues以实现它。 - eerorika
我也在尝试查看time_point--http://www.boost.org/doc/libs/1_55_0/doc/html/chrono/reference.html#chrono.reference.cpp0x.time_point_hpp.time_point - user3295725
@user2079303,我已经在我的示例中发布了。窍门是使用split_free文档)。 - sehe
1个回答

0

好的,这就是评论一直在暗示的内容:

using hr_clock   = boost::chrono::high_resolution_clock;
using time_point = boost::chrono::time_point<hr_clock>;

namespace boost { namespace archive {

    template<class Archive, typename clock>
        void load(Archive& ar, boost::chrono::time_point<clock>& tp, unsigned)
        {
            using namespace boost::chrono;
            milliseconds::rep millis;

            ar & millis;
            tp = time_point<clock>(milliseconds(millis));
        }

    template<class Archive, typename clock>
        void save(Archive& ar, boost::chrono::time_point<clock> const& tp, unsigned)
        {
            using namespace boost::chrono;
            milliseconds::rep millis = duration_cast<milliseconds>(tp.time_since_epoch()).count();
            ar & millis;
        }
} }

注意

  • 我让它可以适用于其他时钟。
  • time_point 似乎只考虑从一天的开始算起的毫秒数(这可能是您期望的,但在这方面,我发现名称 since_epoch 有点令人困惑)

完整代码

供参考

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/split_free.hpp>
#include <boost/chrono.hpp>

using hr_clock   = boost::chrono::high_resolution_clock;
using time_point = boost::chrono::time_point<hr_clock>;

namespace boost { namespace archive {

    template<class Archive, typename clock>
        void load(Archive& ar, boost::chrono::time_point<clock>& tp, unsigned)
        {
            using namespace boost::chrono;
            milliseconds::rep millis;

            ar & millis;
            tp = time_point<clock>(milliseconds(millis));
        }

    template<class Archive, typename clock>
        void save(Archive& ar, boost::chrono::time_point<clock> const& tp, unsigned)
        {
            using namespace boost::chrono;
            milliseconds::rep millis = duration_cast<milliseconds>(tp.time_since_epoch()).count();
            ar & millis;
        }

    template<class Archive, typename clock>
        inline void serialize(Archive & ar, boost::chrono::time_point<clock>& tp, unsigned version)
        {
            boost::serialization::split_free(ar, tp, version);
        }
} }

struct myTimestamp
{
    time_point  begin1;
    time_point  end1;

  private:
    friend class boost::serialization::access;
    template<class Archive>
        void serialize(Archive &ar, unsigned)
        {
            ar & begin1;
            ar & end1;
        }

  public:
    myTimestamp()
        : begin1(hr_clock::now()),
            end1(hr_clock::now() + boost::chrono::hours(1))
    {  }
    virtual  ~myTimestamp() { }
};

#include <sstream>

int main()
{
    std::stringstream ss;
    {
        myTimestamp ts;
        boost::archive::text_oarchive oa(ss);
        oa << ts;
    }

    {
        myTimestamp ts;
        boost::archive::text_iarchive ia(ss);
        ia >> ts;

        boost::archive::text_oarchive oa(std::cout);
        oa << ts;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接