【问题标题】:serialization of type boost::chrono::timepoint does not workboost::chrono::timepoint 类型的序列化不起作用
【发布时间】:2014-06-24 02:08:45
【问题描述】:

我正在尝试序列化 boost::chrono::time_point tp 类型的结构中的成员,但给出错误序列化不是 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吗?
  • @user2079303 - 是的,它是 boost::chrono::time_point
  • @user2079303 您的回答很好地提示了如何解决这个问题。可悲的是,我还没有找到描述这一点的其他答案。有时间我会写点东西的
  • @sehe,比我的回答要好一点(可重复使用)是为time_point&lt;high_resolution_clock&gt; 定义一个免费的serialize 函数,但我不知道如何访问@ 的左值987654326@ 内部实现它。
  • 我也在尝试查看 time_point -- boost.org/doc/libs/1_55_0/doc/html/chrono/…

标签: c++ serialization boost boost-serialization


【解决方案1】:

好的,这是 cmets 一直在暗示的:

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;
    }
}

【讨论】:

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