
◇ シリアライズ(::Serialize)とは?
オブジェクトをバイナリ配列に変換する処理をシリアライズと呼びます。
基本型はもちろんstd::vectorやstd::stringなどの動的なメモリを持つオブジェクトも変換できます。
◇ アンシリアライズ(::Unserialize)とは?
バイナリ配列をオブジェクトに戻す作業をアンシリアライズと呼びます。
こちらも基本型はもちろんstd::vectorやstd::stringなどの動的なオブジェクトにも対応します。
◇ エンディアンについて
バイナリ配列に変化するまでの過程(その逆の過程でも)でエンディアンの処理……Byteswapが必須となります。ところでserialize.hの基本型処理の部分にByteswapが組み込まれております。そのためserialize.hに新しい型を追加する場合でもエンディアンの処理を考える必要はありません。
◇ CDataStreamとは?
バイナリを処理するためのバッファを積み そのバッファとしてSecure Allocatorを搭載するstd::vectorタイプのストリームです。
::Serializeと::Unserializeの第一引数に指定すると第二引数へのストリームとして作用します。
なおそれを毎回書くのは面倒なのでストリーム演算子(<<, >>)がoperatorに記述されております。
そのoperatorの作用によりバイナリ列とオブジェクトを容易に行き来できます。
※ 順番厳守です。A, B, Cと入力した場合はA, B, Cと取り出します。
◇ 注意点
Secure Allocator付属のバッファを積むため値渡し以上の演算コストが発生いたします。
それゆえ何も考えずに多用すると非常に重くなります。
※ よくウォレットが重くなって応答しなくなるあの状態です。
※ ブロックチェーンの鍵が絡む場面では必須で忘れることが許されないためそこに合わせたとみております。
◇ ストリームとは?
読み書きのインターフェイスを持つクラスをストリームと呼びます。
例えばバッファに対して読み書きを持つストリームはメモリに対する読み書きになります。ファイルに対する読み書きを持つストリームはファイルに対する読み書きになりますね。
※ bitcoinではReadとWriteメソッドを持つとストリームになることができます。
※ またはADD_SERIALIZE_METHODSを与えます。このマクロは構造体をストリームに変化させる働きがあります。
◇ サンプルコード
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);