cista
v0.15
CISTA ++は、C ++データ構造のシリアル化(DE-)シリアル化のシンプルなオープンソース(MITライセンス)C ++ 17です。
シングルヘッダー - 依存関係なし。マクロはありません。ソースコード生成はありません。
基礎となる反射メカニズムも他の方法で使用できます!
例:
最新リリースをダウンロードして、試してみてください。
バッファーへの簡単な例:
namespace data = cista::raw;
struct my_struct { // Define your struct.
int a_{ 0 };
struct inner {
data::string b_;
} j;
};
std::vector< unsigned char > buf;
{ // Serialize.
my_struct obj{ 1 , {data::string{ " test " }}};
buf = cista::serialize (obj);
}
// Deserialize.
auto deserialized = cista::deserialize<my_struct>(buf);
assert (deserialized->j.b_ == data::string{ " test " });高度な例メモリマップファイルにハッシュマップを書き込む:
namespace data = cista::offset;
constexpr auto const MODE = // opt. versioning + check sum
cista::mode::WITH_VERSION | cista::mode::WITH_INTEGRITY;
struct pos { int x, y; };
using pos_map = // Automatic deduction of hash & equality
data::hash_map<data::vector<pos>,
data::hash_set<data::string>>;
{ // Serialize.
auto positions =
pos_map{{{{ 1 , 2 }, { 3 , 4 }}, { " hello " , " cista " }},
{{{ 5 , 6 }, { 7 , 8 }}, { " hello " , " world " }}};
cista::buf mmap{cista::mmap{ " data " }};
cista::serialize<MODE>(mmap, positions);
}
// Deserialize.
auto b = cista::mmap( " data " , cista::mmap::protection::READ);
auto positions = cista::deserialize<pos_map, MODE>(b);派生クラスやカスタムコンストラクターを備えたクラスなどの非凝集タイプのサポートを示す高度な例:
namespace data = cista::offset;
constexpr auto MODE = cista::mode::WITH_VERSION;
struct parent {
parent () = default ;
explicit parent ( int a) : x_{a}, y_{a} {}
auto cista_members () { return std::tie (x_, y_); }
int x_, y_;
};
struct child : parent {
child () = default ;
explicit child ( int a) : parent{a}, z_{a} {}
auto cista_members () {
return std::tie (* static_cast <parent*>( this ), z_);
}
int z_;
};
/*
* Automatically defaulted for you:
* - de/serialization
* - hashing (use child in hash containers)
* - equality comparison
* - data structure version ("type hash")
*/
using t = data::hash_map<child, int >;
// ... usage, serialization as in the previous examples詳細については、ベンチマークリポジトリをご覧ください。
| 図書館 | シリアライズ | 脱介入 | 速く脱色 | トラバース | DeserializeとTraverse | サイズ |
|---|---|---|---|---|---|---|
| Cap'n Proto | 105ミリ秒 | 0.002ミリ秒 | 0.0ミリ秒 | 356ミリ秒 | 353ミリ秒 | 50.5m |
| 穀物 | 239ミリ秒 | 197.000ミリ秒 | - | 125ミリ秒 | 322ミリ秒 | 37.8m |
Cista ++ offset | 72ミリ秒 | 0.053ミリ秒 | 0.0ミリ秒 | 132ミリ秒 | 132ミリ秒 | 25.3m |
Cista ++ raw | 3555ミリ秒 | 68.900ミリ秒 | 21.5ミリ秒 | 112ミリ秒 | 133ミリ秒 | 176.4m |
| フラットバッファー | 2349ミリ秒 | 15.400ミリ秒 | 0.0ミリ秒 | 136ミリ秒 | 133ミリ秒 | 63.0m |
読者と作家は同じポインター幅を持つ必要があります。別のバイト順序(EndianEss)でシステムのデータをロードすることがサポートされています。例:
現在、C ++ 17ソフトウェアのみがデータを読み取る/書き込みます。しかし、他のプログラミング言語のアクセサを生成することも可能です。
他のプログラミング言語と互換性があるか、プロトコルの進化(下向きの互換性)が必要な場合は、別のソリューションを探す必要があります。
お気軽に寄付してください(バグレポート、リクエストをプルするなど)!