boost::serializatioでシリアライズしたデータがweb上(例えば自分のサイト)にあり、PC上のプログラムから利用したい場合、一時的にダウンロードしてデシリアライズすれば簡単なのだが、後で一時ファイルを削除する手間が生じる。
以下、ダウンロードしないまま利用する方法をメモ。
手順は以下の3ステップ。
(1)UrlからデータをTStreamに読み込む
(2)TStreamからバイト列(char配列)に書き込む
(3)バイト列からデシリアライズ(boost::iostreamsを使う)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <System.Net.HttpClient.hpp> // THTTPClient: #include <memory> #include <boost/archive/binary_iarchive.hpp> #include <boost/iostreams/device/array.hpp> #include <boost/iostreams/stream.hpp> // シリアライズ対象のクラス #include "test_serialize_class.h" int _tmain(int argc, _TCHAR* argv[]) { // 指定urlからファイルをTStreamに読み込む // ------------------------------------------------ // サイト上にあるシリアライズデータのurl String Url( L"https://www.xxxxxxxx.com/xxxxxxxx/xxxxxxx.dat" ); std::unique_ptr<THTTPClient> HttpClient( THTTPClient::Create() ); auto Response = HttpClient->Get( Url ); // _di_IHTTPResponse型 // Response->StatusCodeで"404"等のStatusCodeが取れる(ここでは省略) // TStreamからchar配列に書き込み // ------------------------------------------------ const auto size = Response->ContentStream->Size; // Response->ContentStreamでTStream*が取れる char* buffer = new char[size]; Response->ContentStream->Read( buffer, size ); // char配列からデシリアライズ // ------------------------------------------------ boost::iostreams::basic_array_source<char> sr( buffer, size ); boost::iostreams::stream<boost::iostreams::basic_array_source<char>> source( sr ); boost::archive::binary_iarchive ia( source ); delete [] buffer; // 後始末 // デシリアライズ対象のクラス test_serialize test_class; try{ ia >> test_class; // デシリアライズ }catch(...){ return 0; // 何かエラー処理 } return 0; } |
C++Builder10.2.3 (Boost1.55.0) / Windows10(22H2)で確認。