Kendi sınıfımızı Serialize Etmek
Tek yapmamız gereken sınıfımızı boost ile friend ilan etmek ve bir serialize metodu yazmak. Şöyle yaparız.
BOOST_SERIALIZATION_SPLIT_FREE
Şu satırı dahil ederiz.
BOOST_SERIALIZATION_BASE_OBJECT_NVP
Sanırım şu dosya dahil edilir.
Verinin name value pair şeklinde olmasını sağlar. Şöyle yaparız.
Archive Sınıfı
Archive sınıfı text ve binary olmak üzere ikiye ayrılıyor. Bunlar text_iarchive, text_oarchive, binary_iarchive, binary_oarchive sınıfları.
Archive Sınıfı'na yazmak için "&" veya "<<" operatörleri kullanılabilir. Çok emin olmamakla beraber archive sınıfı "const getter" sınıfları ile iyi çalışmıyor sanırım.
Polymorphic archive sınıfları
Bu sınıfları anlamadım ancak binary olanlar için şu satırları dahil ederiz.
Tek yapmamız gereken sınıfımızı boost ile friend ilan etmek ve bir serialize metodu yazmak. Şöyle yaparız.
class MyClass
{
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{...}
};
Kendi serialization metodumuz içinde Archive sınıfının bazı özelliklerini kullanabiliriz.if (Archive::is_saving::value) {...}
veyaif (Archive::is_loading::value) {...}
veyaboost::serialization::make_array (...)
Şöyle yaparız.template<class Archive>
void serialize(Archive &ar, cv::Mat& mat, const unsigned int)
{
int cols, rows, type;
bool continuous;
if (Archive::is_saving::value) {
cols = mat.cols; rows = mat.rows; type = mat.type();
continuous = mat.isContinuous();
}
ar & cols & rows & type & continuous;
if (Archive::is_loading::value)
mat.create(rows, cols, type);
if (continuous) {
const unsigned int data_size = rows * cols * mat.elemSize();
ar & boost::serialization::make_array(mat.ptr(), data_size);
} else {
const unsigned int row_size = cols*mat.elemSize();
for (int i = 0; i < rows; i++) {
ar & boost::serialization::make_array(mat.ptr(i), row_size);
}
}
}
BOOST_SERIALIZATION_SPLIT_FREE
Şu satırı dahil ederiz.
#include <boost/serialization/split_free.hpp>
Bu macro ile ilgili örnek bulBOOST_SERIALIZATION_BASE_OBJECT_NVP
Sanırım şu dosya dahil edilir.
#include <boost/serialization/base_object.hpp>
Ata sınıfın name value pair şeklinde serialize metodunun çağrılmasını sağlar. Şöyle yaparız.struct Base {
template<class Archive> void serialize(Archive &, const unsigned int) {...}
};
class Derived : public Base
{
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int) {
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
ar & BOOST_SERIALIZATION_NVP(...);
...
}
...
};
Eğer NVP şeklinde yapmak istemezsek şöyle yaparız.template<class Archive>
void serialize(Archive & ar, const unsigned int file_version){
boost::serialization::base_object<Base>(*this);
...
}
BOOST_SERIALIZATION_NVPVerinin name value pair şeklinde olmasını sağlar. Şöyle yaparız.
template<class Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & BOOST_SERIALIZATION_NVP(...);
...
}
Serialize işleminde şöyle yaparız.Foo foo;
boost::archive::xml_oarchive oa(std::cout);
oa << BOOST_SERIALIZATION_NVP(foo);
Şöyle bir çıktı alırız.<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="14">
<foo class_id="0" tracking_level="0" version="0">
...
</foo>
</boost_serialization>
Archive Sınıfı
Archive sınıfı text ve binary olmak üzere ikiye ayrılıyor. Bunlar text_iarchive, text_oarchive, binary_iarchive, binary_oarchive sınıfları.
Archive Sınıfı'na yazmak için "&" veya "<<" operatörleri kullanılabilir. Çok emin olmamakla beraber archive sınıfı "const getter" sınıfları ile iyi çalışmıyor sanırım.
Polymorphic archive sınıfları
Bu sınıfları anlamadım ancak binary olanlar için şu satırları dahil ederiz.
#include <boost/archive/polymorphic_binary_oarchive.hpp>
#include <boost/archive/
polymorphic_binary_iarchive.hpp>
Text olanlar için şu satırları dahil ederiz.
Şöyle yaparız.
#include <boost/archive/polymorphic_text_iarchive.hpp>
#include <boost/archive/polymorphic_text_oarchive.hpp
>
ConstructorŞöyle yaparız.
std::ifstream ifs = ...;
boost::archive::polymorphic_text_iarchive ia(ifs);
Şöyle yaparız.boost::archive::polymorphic_text_iarchive ia(ifs, boost::archive::no_codecvt);
Hiç yorum yok:
Yorum Gönder