Random Tech Thoughts

The title above is not random

Boost Serialization库使用中的一点问题

  • 使用stl容器还有string时需要包含serialization库中封装过的头文件,不能直接使用容器原来的头文件。

  • 保存非const对象时遇到编译时错误。比如如下的代码:
        T t; // No problem if use "const T t;"
        std::ofstream ofs(filename);
        boost::archive::text_oarchive oa(ofs);
        oa << t; // Cause compile time error.
    
    这个在boost serialization的文档中rationale下有说明,主要是因为Object tracking而引起的。Object tracking通过跟踪指针地址来防止对同一个对象的多次保存。我的解决办法是
    1. BOOST_CLASS_TRACKING(classname, boost::serialization::track_never)宏来禁止对类的Object tracking。不过这样就失去了Object tracking的功能,如果通过指针来保存对象可能会产生问题。
    2. 需要保存或恢复对象的时候使用专门的函数。如:
      template
      void save(const Obj& s, const char* filename) {
          std::ofstream ofs(filename);
          boost::archive::text_oarchive oa(ofs);
          oa << s;
      }
      
      template
      void restore(Obj& s, const char* filename) {
          std::ifstream ifs(filename);
          boost::archive::text_iarchive ia(ifs);
          ia >> s;
      }
      
      这样就不会产生编译时错误了。不过我对C++的了解实在是太少了(实际使用的过程中感觉尤其明显),看了例子以后虽然知道这样做可以解决问题,但是不知道究竟是为什么。

Comments