Serialization etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Serialization etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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);

26 Ekim 2015 Pazartesi

Serialization

Serilization ile aldığım notlar aşağıda.

Binary Serialization

Java
Serialization yazısına taşıdım.

Apache Commons
Bu konuyla ilgili Apache Commons yazısına göz atabilirsiniz.

C#
BinaryFormatter Sınıfı yazısına taşıdım.

C++
C++ ile serialization desteği gelmiyor. Ancak kendi kendimize yapmak ta kolay.
Sınıfa >> operatörü eklenir ve aşağıdakina benzer bir kod kullanılır.
ifstream file("file.txt");
vector<myclass> col;
copy(istream_iterator<myclass>(file), istream_iterator<myclass>(),
                                                 back_inserter(col));
boost
boost serialization yazısına taşıdım.
 
XML Serialization 
C#
C#'ta XML serailization işlemini yerine getiren iki sınıf var. Bunlar XmlSerializer ve DataContractSerializer. DataContractSerializer daha yeni bir sınıf. İkisi arasındaki farkı okumak için buraya bakanız.

XMLSerializer
XmlSerializer sınıfı verilen nesneyi XML olarak yazar ve okuyabilir. Bu sınıf constructor metoduna
serialize veya deserialize edilecek nesnenin type bilgilerini alır. Örnek:
XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
Yazma işlemi
Aşağıda hem yeni satırları doğru yazan hem de boşluklara dikkat eden XML serialization örneği var.
XMLWriterSettings writerSettings = new XMLWriterSettings();
writerSettings.NewLineHandling = NewLineHandler.Entitize;
writerSettings.Indent = true;
XMLSerializer serializer = new XMLSerializer (typeof(MyClass));
using (XMLWriter xmlWriter = XMLWriter.Create ("myfile.xml",writerSettings)){
    serializer.Serialize (writer,myClassInstance);

Okuma İşlemi
C# XMLSerializer ile Okuma yazısına taşıdım.

XMLType Annotation
Mesaj hiyerarşilerinde, temel sınıfa diğer sınıfları tanıtmak gerekir. Örnek:
[XmlType("DerivedClass1")]
class BaseClass{}

XMLIgnore Annotation
Aynı Java'daki gibi bazı nesneler XML'e çevrilmesin isteniyorsa, işaretlenebilirler. Örnek:
DataContractSerializer
Örnek yaz.