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;)
Không nên sử dụng 'class Use' từ' Base' hoặc 'GenericBase'? – Inverse
Không, sử dụng lớp Sử dụng cơ sở làm thuộc tính – user408535
Lớp sử dụng bạn cung cấp thiếu chức năng tuần tự hóa. –