2010-09-08 28 views
12

Sử dụng thư viện boost serialization Tôi có một chức năng serialize() thành viên rất đơn giản, một cái gì đó như:Làm thế nào để phân biệt hoạt động đọc/ghi trong tuần tự tăng cường?

template <class Archive> 
    void serialize(Archive& ar, unsigned version) 
    { 
    ar & m_Searcher; 
    } 

... và tôi muốn giữ nó đơn giản này (tôi không muốn sử dụng tách riêng). Nhưng trong trường hợp của văn bản tôi muốn làm một số "chuẩn bị" cho m_Searcher trước khi viết thực tế diễn ra.

{ 
    if(this-is-a-writing-operation) 
    do-some-preparation(m_Searcher) 

    ar & m_Searcher; 
} 

Có cách nào đơn giản để phân biệt giữa hoạt động đọc và viết không?

+0

nếu bạn không ngại chia logic thành hai chức năng, hãy xem http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/serialization.html#splitting – Ammar

Trả lời

24

Tôi nghĩ bạn có thể làm điều này mà không cần tách, đó sẽ là cách thông thường:

if (Archive::is_saving::value) 
    doSomething(); 

này được thừa hưởng từ giao diện cơ sở rằng việc sử dụng Lưu trữ, trong boost/archive/detail/interface_[ia]archive.hpp

Các mã sau đây chứng minh rằng nó có vẻ là một giải pháp hợp lý với 1.42

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/archive/xml_oarchive.hpp> 
#include <boost/archive/xml_iarchive.hpp> 

// oarchive: 
//text 
static_assert(!boost::archive::text_oarchive::is_loading::value, "out is loading"); 
static_assert(boost::archive::text_oarchive::is_saving::value, "out isn't saving"); 

//xml 
static_assert(!boost::archive::xml_oarchive::is_loading::value, "out is loading"); 
static_assert(boost::archive::xml_oarchive::is_saving::value, "out isn't saving"); 

// iarchive: 
//text 
static_assert(boost::archive::text_iarchive::is_loading::value, "out is loading"); 
static_assert(!boost::archive::text_iarchive::is_saving::value, "out isn't saving"); 

//xml 
static_assert(boost::archive::xml_iarchive::is_loading::value, "out is loading"); 
static_assert(!boost::archive::xml_iarchive::is_saving::value, "out isn't saving"); 

Tôi sẽ thận trọng khi dựa vào một cái gì đó như thế này mặc dù - nhiều trong di sản có thể phá vỡ nó nếu ai đó đã viết một kho lưu trữ mà cả đầu vào và đầu ra nó không rõ ràng với tôi như thế nào permenant và công cộng phần này của giao diện có nghĩa là phải.

+0

Như một số loại kiểm tra bảo vệ chống lại các vấn đề nói trên với các kho lưu trữ hai chiều có thể có thêm 'static_assert (Lưu trữ :: is_saving :: giá trị! = Lưu trữ :: is_loading :: giá trị);' –

Các vấn đề liên quan