MPACK adalah implementasi C encoder dan decoder untuk format serialisasi MessagePack. Dia:
Inti dari mpack berisi pembaca dan penulis buffered, dan parser bergaya pohon yang mendekode ke pohon node yang diketik secara dinamis. Fungsi helper dapat diaktifkan untuk membaca nilai dari jenis yang diharapkan, untuk bekerja dengan file, untuk menumbuhkan buffer atau mengalokasikan string secara otomatis, untuk memeriksa pengkodean UTF-8, dan banyak lagi.
Kode mpack cukup kecil untuk disematkan langsung ke basis kode Anda. Cukup unduh paket amalgamasi dan tambahkan mpack.h dan mpack.c ke proyek Anda.
MPACK mendukung semua kompiler modern, semua desktop dan ponsel pintar, WebAssembly, di dalam kernel Linux, dan bahkan mikrokontroler 8-bit seperti Arduino. Fitur Mpack dapat disesuaikan pada waktu kompilasi untuk mengatur fitur mana, komponen, dan pemeriksaan debug dikompilasi, dan dependensi apa yang tersedia.
Node API mem-parsing sepotong data messagePack ke pohon imutabab dengan node yang diketik secara dinamis. Serangkaian fungsi pembantu dapat digunakan untuk mengekstrak data jenis tertentu dari setiap node.
// parse a file into a node tree
mpack_tree_t tree ;
mpack_tree_init_filename ( & tree , "homepage-example.mp" , 0 );
mpack_tree_parse ( & tree );
mpack_node_t root = mpack_tree_root ( & tree );
// extract the example data on the msgpack homepage
bool compact = mpack_node_bool ( mpack_node_map_cstr ( root , "compact" ));
int schema = mpack_node_i32 ( mpack_node_map_cstr ( root , "schema" ));
// clean up and check for errors
if ( mpack_tree_destroy ( & tree ) != mpack_ok ) {
fprintf ( stderr , "An error occurred decoding the data!n" );
return ;
}Perhatikan bahwa tidak ada penanganan kesalahan tambahan yang diperlukan dalam kode di atas. Jika file tidak ada atau korup, jika kunci peta hilang atau jika node tidak ada dalam tipe yang diharapkan, node "NIL" khusus dan nilai false/nol dikembalikan dan pohon ditempatkan dalam keadaan kesalahan. Pemeriksaan kesalahan hanya diperlukan sebelum menggunakan data.
Contoh di atas mengalokasikan node secara otomatis. Kumpulan simpul tetap dapat diberikan kepada parser sebagai gantinya di lingkungan yang dibatasi memori. Untuk kinerja maksimum dan penggunaan memori minimal, API yang diharapkan dapat digunakan untuk menguraikan data skema yang telah ditentukan.
API Write mengkodekan data terstruktur ke messagePack.
// encode to memory buffer
char * data ;
size_t size ;
mpack_writer_t writer ;
mpack_writer_init_growable ( & writer , & data , & size );
// write the example on the msgpack homepage
mpack_build_map ( & writer );
mpack_write_cstr ( & writer , "compact" );
mpack_write_bool ( & writer , true);
mpack_write_cstr ( & writer , "schema" );
mpack_write_uint ( & writer , 0 );
mpack_complete_map ( & writer );
// finish writing
if ( mpack_writer_destroy ( & writer ) != mpack_ok ) {
fprintf ( stderr , "An error occurred encoding the data!n" );
return ;
}
// use the data
do_something_with_data ( data , size );
free ( data );Dalam contoh di atas, kami mengkodekan ke buffer memori yang dapat ditanam. Penulis dapat menulis ke buffer yang dialokasikan atau dialokasikan pra-stack (dengan ukuran di muka untuk jenis senyawa), menghindari kebutuhan akan alokasi memori. Penulis juga dapat disediakan dengan fungsi flush (seperti fungsi file atau socket write) untuk dihubungi ketika buffer penuh atau saat menulis dilakukan.
Jika ada kesalahan yang terjadi, penulis ditempatkan dalam keadaan kesalahan. Penulis akan menandai kesalahan jika terlalu banyak data ditulis, jika jumlah elemen yang salah ditulis, jika terjadi kegagalan alokasi, jika data tidak dapat disiram, dll. Tidak ada penanganan kesalahan tambahan yang diperlukan dalam kode di atas; Setiap tulisan berikutnya diabaikan ketika penulis dalam keadaan kesalahan, jadi Anda tidak perlu memeriksa setiap tulisan untuk kesalahan.
Contoh di atas menggunakan mpack_build_map() untuk secara otomatis menentukan jumlah pasangan nilai kunci yang terkandung. Jika Anda tahu di muka jumlah elemen yang diperlukan, Anda dapat meneruskannya ke mpack_start_map() sebagai gantinya. Dalam hal ini mpack_finish_map() yang sesuai akan menyatakan dalam mode debug bahwa jumlah elemen yang diharapkan sebenarnya ditulis, yang merupakan sesuatu yang mungkin tidak dilakukan oleh pustaka C/C ++ MessagePack lainnya.
Mpack kaya akan fitur sambil mempertahankan kinerja yang sangat tinggi dan jejak kode kecil. Berikut tabel fitur pendek yang membandingkannya dengan parsers C lainnya:
| Mpack (v1.1) | msgpack-c (v3.3.0) | CMP (v19) | CWPack (v1.3.1) | |
|---|---|---|---|---|
| Tidak ada persyaratan libc | ✓ | ✓ | ✓ | |
| Penulis memori yang bisa ditanam | ✓ | ✓ | ✓* | |
| File I/O Pembantu | ✓ | ✓ | ✓* | |
| Penanganan kesalahan stateful | ✓ | ✓ | ||
| Parser tambahan | ✓ | ✓ | ✓ | |
| Parser aliran pohon | ✓ | ✓ | ||
| Pelacakan Ukuran Senyawa | ✓ | |||
| Ukuran senyawa otomatis | ✓ |
Tabel perbandingan fitur yang lebih besar tersedia di sini yang mencakup deskripsi berbagai entri dalam tabel.
Rangkaian pembandingan ini membandingkan kinerja mpack dengan implementasi lain dari format serialisasi skema. Mpack mengungguli semua perpustakaan JSON dan MessagePack (kecuali CWPACK), dan dalam beberapa tes Mpack beberapa kali lebih cepat daripada RapidJson untuk data yang setara.
Secara konseptual, MessagePack menyimpan data yang mirip dengan JSON: keduanya terdiri dari nilai -nilai sederhana seperti angka dan string, disimpan secara hierarkis di peta dan array. Jadi mengapa tidak hanya menggunakan JSON saja? Alasan utamanya adalah bahwa JSON dirancang untuk dapat dibaca manusia, sehingga tidak seefisien format serialisasi biner:
Jenis senyawa seperti string, peta dan array dibatasi, sehingga penyimpanan yang tepat tidak dapat dialokasikan di muka. Seluruh objek harus diuraikan untuk menentukan ukurannya.
String tidak disimpan dalam penyandian asli mereka. Karakter khusus seperti kutipan dan backslash harus diloloskan ketika ditulis dan dikonversi kembali saat dibaca.
Angka -angka sangat tidak efisien (terutama saat mem -parsing mengapung kembali), membuat JSON tidak pantas sebagai format dasar untuk data terstruktur yang berisi banyak angka.
Data biner sama sekali tidak didukung oleh JSON. Gumpalan biner kecil seperti ikon dan thumbnail harus dibangun64 yang dikodekan atau diuraikan di luar band.
Masalah -masalah di atas sangat meningkatkan kompleksitas decoder. Decoder JSON berfitur lengkap cukup besar, dan decoder minimal cenderung meninggalkan fitur seperti string Uncercaping dan mengapung parsing, alih-alih menyerahkannya ke pengguna atau platform. Hal ini dapat menyebabkan bug platform khusus dan spesifik lokal yang sulit ditemukan, serta potensi yang lebih besar untuk kerentanan keamanan. Ini juga secara signifikan mengurangi kinerja, membuat JSON tidak menarik untuk digunakan dalam aplikasi seperti game mobile.
Sementara inefisiensi ruang JSON dapat dikurangi sebagian melalui minifikasi dan kompresi, inefisiensi kinerja tidak bisa. Lebih penting lagi, jika Anda meminimalkan dan mengompresi data, lalu mengapa menggunakan format yang dapat dibaca manusia?
Proses pembuatan mpack tidak membangun mpack ke dalam perpustakaan; Ini digunakan untuk membangun dan menjalankan tes unit. Anda tidak perlu membangun mpack atau rangkaian pengujian unit untuk menggunakan mpack.
Lihat tes/readme.md untuk informasi tentang cara menguji mpack.