シリアライズ(::Serialize)とは?

オブジェクトをバイナリ配列に変換する処理をシリアライズと呼びます。
基本型はもちろん、std::vectorやstd::stringなどの動的なメモリを持つオブジェクトも、変換できます。

アンシリアライズ(::Unserialize)とは?

バイナリ配列をオブジェクトに戻す作業をアンシリアライズと呼びます。
こちらも、基本型はもちろん、std::vectorやstd::stringなどの動的なオブジェクトにも対応します。

エンディアンについて

バイナリ配列に変化するまでの過程(その逆の過程も)で、エンディアンの処理が必須となります。
ところですでに、serialize.hの基本型処理の部分に、Byteswapが組み込まれております。
そのため、serialize.hに新しい型を追加する場合でも、エンディアンの処理を考える必要はありません。

CDataStreamとは?

バイナリ配列を処理するためにバッファを積み、
そのバッファとしてSecure Allocatorを搭載するstd::vectorを持つ「ストリーム」クラスです。
::Serializeと::Unserializeの第一引数に指定すると、第二引数へのストリームとして作用します。
なお、それを毎回書くのは面倒なので、ストリーム演算子(<<, >>)がoperatorに記述されております。

注意点

Secure Allocator付属のバッファを積みますので「値渡し以上の演算コスト」が発生いたします。
それゆえに、何も考えずに多用すると非常に重くなりますので、工夫が必要です。
よくウォレットが重くなって応答しなくなる……あの状態です。(^^;
それでも、ブロックチェーンの「鍵」が絡む場面では必須です。
ただ……CDataStreamに搭載されているSecure Allocatorは::mlockがないタイプでした。
そのため、重要な場面では、これに::mlockを乗せたCLockDataStreamを使用するように改良します。

ストリームとは?

読み書きのインターフェイスを持つクラスを「ストリーム」と呼びます。
例えばバッファに対して読み書きを持つストリームはメモリに対する読み書きになります。
そして、ファイルに対する読み書きを持つストリームはファイルに対する読み書きになりますね。
bitcoinでは「Read」「Write」メソッドを持つと、この「ストリーム」になることができます。

サンプルコード

int neko1=0, neko2=1;
std::string neko3="mikeneko to shibainu";

CDataStream ssData;
ssData << neko1 << neko2 << neko3;

int doge1, doge2;
std::string doge3;
ssData >> doge1 >> doge2 >> doge3;

assert(neko1==doge1 && neko2==doge2 && neko3==doge3);
	
□ 本ページをご覧いただきました方は、以下のページもよくご覧いただいております。
■ 集計中.....