以自定义方式增强序列化数据

时间:2018-07-16 14:50:46

标签: c++ serialization boost

假设我有一些对象列表存储在地图中的某处。我的目标是通过这样的键序列化所有共享指针:

namespace boost { namespace serialization {

template<class Archive, class T>
inline void serialize(Archive& ar, boost::shared_ptr<T>& b, const unsigned int file_version)
{
    std::string key_of_b = // get a key of object b;
    ar << key_of_b;
}

} }

然后,在通过序列化的键进行序列化的过程中,取回映射中的对象。是否可以仅使用boost :: shared_ptr对对象进行序列化/反序列化?喜欢:

int main() {

        std::stringstream ss;

        // serialize
        boost::shared_ptr<int> p{new int{1123}};
        boost::archive::text_oarchive oa(ss);
        oa << p1;

        // deserialize
        boost::archive::text_iarchive ia(ss);
        boost::shared_ptr<int> p_i{new int{1123}};
        ia >> p_i;

        return 0;
    }

我知道代码无法以这种方式工作。我想用serialize方法处理序列化/反序列化:

template<class Archive, class T>
    inline void serialize(Archive& ar, boost::shared_ptr<T>& b, const unsigned int file_version)
    {
        if (boost::archive::text_oarchive::is_saving::value) {
          std::string key_of_b = // get a key of object b;
          ar << key_of_b;
        } else {
          std::string key;
          ar >> key;
          // get the T
        }
    }

那是正确的还是还有另一种更好的方法?

1 个答案:

答案 0 :(得分:1)

由于您是专门讨论某些 T,因此请不要在serialize名称空间内提供过于通用的boost模板。

相反,利用ADL并将其放入您的自定义类型:

namespace MyLib {
    struct MyType { /*....*/ };

    template<class Archive>
    void save(Archive& ar, boost::shared_ptr<MyType> const& p, unsigned)
    {
        ...
    }
    template<class Archive>
    void load(Archive& ar, boost::shared_ptr<MyType>& p, unsigned)
    {
        ...
    }

    template<class Archive> inline void serialize(Archive& ar, boost::shared_ptr<MyType>& p, unsigned file_version) {
        split_free(ar, p, file_version); 
    }

} // namespace MyLib

关于split_free参见documentation