26 Temmuz 2016 Salı

boost serialization

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.
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) {...}
veya
if (Archive::is_loading::value) {...}
veya
boost::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 bul

BOOST_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_NVP
Verinin 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.
#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