22 Ağustos 2017 Salı

serialization make_nvp

Giriş
İmzası şöyle
template<class T>
const nvp< T > make_nvp(const char * name, T & t);
make_nvp() hem serialization hem de deserialization tarafından kullanıldığı için T nesnesi const olarak kullanılamaz.

Yanlış Kullanım
Nesnenin yazılacak alanına getter() metodu ile erişerek yazdırmak yanlış. option 1 kopya aldığı için object tracking'i bozuyor. option 2'yi tercih etmek gerekir.
// option 1
auto a = data.getA();
ar & make_nvp("A", a);

// option 2
ar & make_nvp("A", data._a); // _a is private, but serializer is friend
Örnek
xml_oarchive nesnesi ile şöyle yaparız
std::ofstream ofs(filename);
boost::archive::xml_oarchive oa(ofs);
oa << boost::serialization::make_nvp("FieldSet", mFieldSet);
Örnek
serialize metodu içinde şöyle yaparız.
void serialize(Archive& archive, const unsigned int) {
  archive & boost::serialization::make_nvp("Name", mName);
  archive & boost::serialization::make_nvp("Value", mValue);
}
Çıktı olarak şunu alırız.
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="10">
  <FieldSet class_id="0" tracking_level="0" version="0">
    <Size>5</Size>
    <Field class_id="1" tracking_level="0" version="0"></Field>
    <Field>
      <Name>Time</Name>
      <Value>0</Value>
    </Field>
    <Field>
      <Name>Speed</Name>
      <Value>0.0</Value>
    </Field>
  </FieldSet>
</boost_serialization>

Hiç yorum yok:

Yorum Gönder