2010-08-02 28 views
5

tôi muốn serialize một lớp học với một thuộc tính như một danh sách gợi ý về một lớp genericC++ Tăng serialization Serializing các lớp thừa kế templated

Đây là lớp cha mà từ đó các lớp generic xuất phát:

class Base{ 

    public : 

     friend class boost::serialization::access; 

     virtual ~Base(){} 

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

     virtual string Getid() = 0 ; 

}; 

lớp generic:

template<typename T> 
class GenericBase : public Base 
{ 
    public: 

     friend class boost::serialization::access; 

     GenericBase<T>(string id){} 
     ~GenericBase(){} 

     string id; 

     vector<T> data 

     template<class Archive> 
     void serialize(Archive & ar, const unsigned int version) 
     { 
      ar & boost::serialization::base_object<Base>(*this); 
      ar & BOOST_SERIALIZATION_NVP(id); 
      ar & BOOST_SERIALIZATION_NVP(data); 

     } 

     string Getid() { return id; } 

}; 

Lớp tôi muốn serialize

class Use 
{ 
    public: 

     friend class boost::serialization::access; 

     int Id; 

     map<string, Base*> BaseDatas; 

     Use(); 
     ~Use(); 

}; 

Vì vậy, sau khi đọc doc tăng serialization (http://www.boost.org/doc/libs/1_43_0/libs/serialization/doc/serialization.html#derivedpointers), tôi đã cố gắng này trong mã serialization:

main(){ 

    Use u = Use(); 

    std::ofstream ofs(filename, ios::binary); 

    // save data to archive 

    boost::archive::binary_oarchive oa(ofs); 

    oa.template register_type<GenericBase<Type1> >(); 
    oa.template register_type<GenericBase<Type2> >(); 
    oa.template register_type<GenericBase<Type3> >(); 

    oa<<u; 

} 

tôi nhận được một tin nhắn,

error: 'template' (as a disambiguator) is only allowed within templates

, vì vậy tôi đã thay thế

oa.template register_type >();

bởi

oa.register_type();

nó làm việc và tôi đã có thể tiết kiệm trong văn bản và nhị phân (i kiểm tra các datas)

để tải bây giờ, tôi chỉ sử dụng những dòng này:

main(){ 

    Use u; 

    std::ifstream ifs(filename, ios::binary); 

    // load data 

    ia.register_type<GenericBase<Type1> >(); 

    boost::archive::binary_iarchive ia(ifs); 

    ia>>u; 

} 

nó đã ném cho tôi một lỗi:

error: no matching function for call to 'GenericBase::GenericBase()'

ai đó đã nói với tôi rằng tôi phải ghi đè 2 phương pháp lưu và tải giống như trong mẫu này http://www.boost.org/doc/libs/1_43_0/libs/serialization/doc/serialization.html#constructors

namespace boost { namespace serialization { 
template<class Archive> 
inline void save_construct_data(
    Archive & ar, const my_class * t, const unsigned int file_version) 
    { 
     // save data required to construct instance 
     ar << t->m_attribute; 
    } 

template<class Archive> 
inline void load_construct_data(
    Archive & ar, my_class * t, const unsigned int file_version) 
    { 
     // retrieve data from archive required to construct new instance 
     int attribute; 
     ar >> attribute; 
     // invoke inplace constructor to initialize instance of my_class 
     ::new(t)my_class(attribute); 
    } 
}} // namespace ... 

nhưng tôi phải xác định chúng ở đâu? Trong tuyên bố của lớp Sử dụng? Và làm cách nào để tôi xử lý thành viên

map<string, Base*> BaseDatas; 

?

nhờ sự giúp đỡ của bạn;)

+0

Không nên sử dụng 'class Use' từ' Base' hoặc 'GenericBase'? – Inverse

+0

Không, sử dụng lớp Sử dụng cơ sở làm thuộc tính – user408535

+0

Lớp sử dụng bạn cung cấp thiếu chức năng tuần tự hóa. –

Trả lời

0

but where do I have to define them ?

Bạn có thể xác định chúng trong bất kỳ tiêu đề của bạn

And how do I deal with the member...

Tôi nghĩ rằng bạn có thể nhận được động lực để theo dõi con trỏ sử dụng BOOST_CLASS_TRACKING ...

http://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/special.html#objecttracking

+0

"Bạn có thể xác định chúng trong bất kỳ tiêu đề nào của bạn" nhưng trong đó lớp học haeder? Sử dụng, Base, GenericBase? "Tôi nghĩ bạn có thể tăng cường để theo dõi con trỏ bằng BOOST_CLASS_TRACKING ..." điểm là gì? vấn đề không phải là một con trỏ đơn lẻ mà là một bản đồ của con trỏ; làm thế nào để tôi đối phó với bản đồ này của con trỏ trong phương thức load_construct_data? – user408535

+0

Tôi đặt tôi vào một tiêu đề riêng biệt được gọi là "serialisation.hpp" ... đó có thể là một nơi tốt, sau đó bao gồm trong các tiêu đề lớp khác? Bản đồ có thể được xử lý bằng cách sử dụng serialization của một số container stl: #include "boost/serialization/map.hpp" – user274244

4

Sẽ dễ dàng hơn nếu bạn nhận xét nếu bạn chuyên nghiệp vide một ví dụ làm việc (cắt và dán) của mã lỗi của bạn, với một số dữ liệu giả ...

Nhưng tôi vẫn cố gắng trả lời ...

Boost.serialisation đang cố gắng gọi hàm dựng mặc định GenericBases, nhưng không thành công do bạn không cung cấp. Boost.serialisation đầu tiên tạo đối tượng của bạn (hoặc thử ngay bây giờ), THEN đọc tệp và đặt các biến.

Bạn có thể thử khai báo một hàm tạo mặc định được bảo vệ, tăng cường này sẽ có quyền truy cập thông qua truy cập.

+0

lưu sự tỉnh táo của tôi, thêm một ctor bảo vệ mặc định và tất cả những gì cần phải bắt đầu làm việc. .. – mentat