CISTA ++-это простой, с открытым исходным кодом (лицензия MIT) C ++ 17 совместимый способ (де-) сериализации структур данных C ++.
Одиночный заголовок - без зависимостей. Нет макросов. Нет генерации исходного кода.
Основной механизм отражения также может использоваться другими способами!
Примеры:
Загрузите последний релиз и попробуйте.
Простой пример написания в буфер:
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Посмотрите на эталонный репозиторий для получения более подробной информации.
| Библиотека | Сериализовать | Пустьялизовать | Быстрый десериализуй | Травер | Дезериализуйте и Траверс | Размер |
|---|---|---|---|---|---|---|
| Cap'n Proto | 105 мс | 0,002 мс | 0,0 мс | 356 мс | 353 мс | 50,5 м |
| злак | 239 мс | 197.000 мс | - | 125 мс | 322 мс | 37,8 м |
CISTA ++ offset | 72 мс | 0,053 мс | 0,0 мс | 132 мс | 132 мс | 25,3 м |
CISTA ++ raw | 3555 мс | 68,900 мс | 21,5 мс | 112 мс | 133 мс | 176.4M |
| Флэтбафферы | 2349 мс | 15,400 мс | 0,0 мс | 136 мс | 133 мс | 63,0 м |
Читатель и писатель должны иметь такую же ширину указателя. Поддерживается загрузка данных в системы с другим байтовым порядком (Endianess). Примеры:
В настоящее время только программное обеспечение C ++ 17 может читать/записать данные. Но должно быть возможно генерировать аксессов и для других языков программирования.
Если вам нужно быть совместимым с другими языками программирования или требует эволюции протокола (совместимость вниз), вы должны искать другое решение:
Не стесняйтесь внести свой вклад (отчеты об ошибках, запросы вытягивают и т. Д.)!