2016-01-20 17 views
5

シリアルを使用してboost::ptr_vectorインスタンスをシリアル化することはできますか?もしそうなら、どうですか?シリアルを使用してboost :: ptr_vectorをシリアル化する方法は?

+2

私は 'ptr_vector'に精通していませんが、基本的に' std :: vector 'のラッパーのようです。シリアルは未処理のポインタをサポートしていないので、シリアルや重大な回避策を大幅に変更することなく 'ptr_vector'をシリアル化することはできないでしょう。 – Azoth

答えて

3

間違いなく可能です。あなたはこのようなアーカイブとポインタタイプの外部save()load()テンプレート関数を作成することができます

#include <iostream> 
#include <sstream> 
#include <boost/ptr_container/ptr_vector.hpp> 
#include <cereal/archives/binary.hpp> 
#include <cereal/types/string.hpp> 

// Sample serializable object. 
struct MyRecord { 
    std::string s_; 

    MyRecord(const std::string s = std::string()) 
     : s_(s) { 
    } 

    template <class Archive> 
    void serialize(Archive& ar) { 
     ar(s_); 
    } 
}; 

// External save function for boost::ptr_vector<T>. 
template<class Archive, class T> 
void save(Archive& ar, const boost::ptr_vector<T>& pv) { 
    ar(pv.size()); 
    for (const auto& element : pv) 
     ar(element); 
} 

// External load function for boost::ptr_vector<T>. 
template<class Archive, class T> 
void load(Archive& ar, boost::ptr_vector<T>& pv) { 
    size_t n; 
    ar(n); 

    pv.reserve(n); 
    for (size_t i = 0; i < n; ++i) { 
     pv.push_back(new T); 
     ar(pv.back()); 
    } 
} 

int main() { 
    // Serialize a boost::ptr_vector to a buffer. 
    std::ostringstream os; 
    { 
     boost::ptr_vector<MyRecord> saved; 
     saved.push_back(new MyRecord("how")); 
     saved.push_back(new MyRecord("now")); 
     saved.push_back(new MyRecord("brown")); 
     saved.push_back(new MyRecord("cow")); 

     cereal::BinaryOutputArchive oa(os); 
     oa(saved); 
    } 

    // Serialize from the buffer. 
    boost::ptr_vector<MyRecord> loaded; 
    { 
     std::istringstream is(os.str()); 
     cereal::BinaryInputArchive ia(is); 
     ia(loaded); 
    } 

    for (const auto& element : loaded) 
     std::cout << element.s_ << '\n'; 

    return 0; 
} 

これがデフォルト-構成可能で、すでに個別に直列化可能である任意の含まれているタイプで動作するはずです。

+0

....これに対して、 'save'と' load'のオーバーロードは_associated namespace_(ADL参照)にあります。私は、このバージョンにはかなり面白い構築セマンティクスがあると付け加えるかもしれません。 ptr_vectorsはエイリアシング要素を持っていないので、「ok」です。 – sehe

+0

@sehe、面白い読み込みセマンティクスを使用すると、これはより効率的に行うことができますか? –

+0

実際、いいえ、うまく見えます。 – sehe

関連する問題