21 Ocak 2018 Pazar

serializaiton binary_iarchive Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/archive/binary_iarchive.hpp>
Açıklaması şöyle. Yani Windows'taki çıktı Linux'ta kullanılamaz.
Boost's builtin binary archive is not portable. It says so in the documentation.
Gerekiyorsa EOS Portable Archive kullanılabilir.

Bu sınıfa stream gibi davranmak doğru değil. Açıklaması şöyle.
Archives are not "random access". They're complete storage formats with a header and (possibly) closing sequence.

If you create an archive to contain 10 records, you'll [have to] read that whole archive. Of course you can stop mid-way, because, you know, you didn't need to read the rest yet. But of course you can't expect to read the rest later, as if a whole new archive were starting at that point, because there isn't. The result is Undefined Behaviour.

Constructor
Bir stream nesnesi ile ilklendirmek gerekir. Stream nesnesi STL stream olabileceği gibi boost::iostreams kütüphanesindeki stream sınıfları da olabilir.

Örnek
Şöyle yaparız. Dosyayı binary olarak açmak gerekir.
char *fileName = ...;

std::ifstream ifs (fileName, std::ios::binary);
if (!ifs) {
  cout << "Read Error" << endl;
}
try {
  boost::archive::binary_iarchive ia(ifs);
  ...
}
catch (boost::archive::archive_exception e) {
  cout << "BOOST ERROR " << e.what() << std::endl;
}
Örnek
Boost Streamleri ile okuma işlemi için şöyle yaparız.
boost::iostreams::stream<source> stream;...
ba::binary_iarchive ia (stream);
Şöyle yaparız.
basic_array_source<char> source = ...;
stream<basic_array_source<char>> stream (source);
ba::binary_iarchive ia (stream);
operator >> metodu - primitive
Şöyle yaparız.
int value = 0;
ia >> value;  
operator >> metodu - STL
Şöyle yaparız.
vector<ObjectDTO> objects;
ia >> objects;


Hiç yorum yok:

Yorum Gönder