MPack เป็นการใช้งาน C ของตัวเข้ารหัสและตัวถอดรหัสสำหรับรูปแบบการทำให้เป็นอนุกรม MessagePack มันคือ:
แกนกลางของ mpack มีเครื่องอ่านและนักเขียนบัฟเฟอร์และตัวแยกวิเคราะห์แบบต้นไม้ที่ถอดรหัสลงในต้นไม้ของโหนดที่พิมพ์แบบไดนามิก ฟังก์ชั่นผู้ช่วยสามารถเปิดใช้งานเพื่ออ่านค่าประเภทที่คาดหวังเพื่อทำงานกับไฟล์เพื่อขยายบัฟเฟอร์หรือจัดสรรสตริงโดยอัตโนมัติเพื่อตรวจสอบการเข้ารหัส UTF-8 และอื่น ๆ
รหัส mpack มีขนาดเล็กพอที่จะฝังลงใน codebase ของคุณโดยตรง เพียงดาวน์โหลดแพ็คเกจการควบรวมกิจการและเพิ่ม mpack.h และ mpack.c ลงในโครงการของคุณ
MPack รองรับคอมไพเลอร์ที่ทันสมัยทั้งหมดเดสก์ท็อปและสมาร์ทโฟนทั้งหมด, เว็บอัสเดอร์ภายใน, ภายในเคอร์เนล Linux และแม้แต่ไมโครคอนโทรลเลอร์ 8 บิตเช่น Arduino MPack featureet สามารถปรับแต่งได้ในเวลาคอมไพล์เพื่อตั้งค่าคุณสมบัติส่วนประกอบและการตรวจสอบการดีบักจะถูกรวบรวมและมีการพึ่งพาอะไรบ้าง
โหนด API วิเคราะห์ข้อมูล MessagePack เป็นต้นไม้ที่ไม่เปลี่ยนรูปของโหนดที่พิมพ์แบบไดนามิก ชุดของฟังก์ชั่นผู้ช่วยสามารถใช้ในการดึงข้อมูลประเภทเฉพาะจากแต่ละโหนด
// 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 ;
}โปรดทราบว่าไม่จำเป็นต้องมีการจัดการข้อผิดพลาดเพิ่มเติมในรหัสด้านบน หากไฟล์หายไปหรือเสียหายหากปุ่มแผนที่หายไปหรือหากโหนดไม่ได้อยู่ในประเภทที่คาดไว้โหนด "ไม่มี" พิเศษและค่าเท็จ/ค่าเป็นศูนย์จะถูกส่งคืนและต้นไม้จะถูกวางไว้ในสถานะข้อผิดพลาด จำเป็นต้องมีการตรวจสอบข้อผิดพลาดก่อนที่จะใช้ข้อมูล
ตัวอย่างข้างต้นจัดสรรโหนดโดยอัตโนมัติ พูลโหนดคงที่สามารถให้กับตัวแยกวิเคราะห์แทนในสภาพแวดล้อมที่มีหน่วยความจำ สำหรับประสิทธิภาพสูงสุดและการใช้หน่วยความจำน้อยที่สุด API ที่คาดหวังสามารถใช้ในการแยกวิเคราะห์ข้อมูลของสคีมาที่กำหนดไว้ล่วงหน้า
การเขียน API เข้ารหัสข้อมูลที่มีโครงสร้างไปยัง 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 );ในตัวอย่างข้างต้นเราเข้ารหัสบัฟเฟอร์หน่วยความจำที่เติบโตได้ ผู้เขียนสามารถเขียนลงในบัฟเฟอร์ที่จัดสรรไว้ล่วงหน้าหรือจัดสรรสแต็ก (ที่มีขนาดล่วงหน้าสำหรับประเภทสารประกอบ) หลีกเลี่ยงความจำเป็นในการจัดสรรหน่วยความจำ ผู้เขียนยังสามารถให้ฟังก์ชั่นการล้าง (เช่นไฟล์หรือฟังก์ชั่นการเขียนซ็อกเก็ต) เพื่อโทรเมื่อบัฟเฟอร์เต็มหรือเมื่อเขียนเสร็จ
หากเกิดข้อผิดพลาดใด ๆ ผู้เขียนจะถูกวางไว้ในสถานะข้อผิดพลาด ผู้เขียนจะตั้งค่าสถานะข้อผิดพลาดหากมีการเขียนข้อมูลมากเกินไปหากมีการเขียนองค์ประกอบที่ไม่ถูกต้องหากเกิดความล้มเหลวในการจัดสรรหากข้อมูลไม่สามารถล้างข้อมูลได้ ฯลฯ ไม่จำเป็นต้องมีการจัดการข้อผิดพลาดเพิ่มเติมในรหัสข้างต้น การเขียนใด ๆ ที่ตามมาจะถูกละเว้นเมื่อผู้เขียนอยู่ในสถานะข้อผิดพลาดดังนั้นคุณไม่จำเป็นต้องตรวจสอบทุกการเขียนสำหรับข้อผิดพลาด
ตัวอย่างข้างต้นใช้ mpack_build_map() เพื่อกำหนดจำนวนคู่คีย์-ค่าโดยอัตโนมัติที่มีอยู่ หากคุณรู้จำนวนองค์ประกอบที่จำเป็นคุณสามารถส่งผ่านไปยัง mpack_start_map() แทน ในกรณีนั้น mpack_finish_map() ที่สอดคล้องกันจะยืนยันในโหมดดีบักว่าจำนวนองค์ประกอบที่คาดหวังถูกเขียนจริงซึ่งเป็นสิ่งที่ MessagePack อื่น ๆ C/C ++ อาจไม่ได้ทำ
Mpack มีคุณสมบัติมากมายในขณะที่ยังคงประสิทธิภาพสูงมากและมีรหัสเล็ก ๆ นี่คือตารางคุณสมบัติสั้น ๆ เปรียบเทียบกับตัวแยกวิเคราะห์อื่น ๆ :
| mpack (v1.1) | msgpack-c (v3.3.0) | CMP (v19) | cwpack (v1.3.1) | |
|---|---|---|---|---|
| ไม่มีข้อกำหนด LIBC | ||||
| นักเขียนหน่วยความจำที่เติบโตได้ | * | |||
| ผู้ช่วย I/O ไฟล์ | * | |||
| การจัดการข้อผิดพลาดของรัฐ | ||||
| ตัวแยกวิเคราะห์ที่เพิ่มขึ้น | ||||
| ต้นไม้ตัวแยกวิเคราะห์ต้นไม้ | ||||
| การติดตามขนาดผสม | ||||
| ขนาดผสมอัตโนมัติ |
ตารางการเปรียบเทียบคุณสมบัติขนาดใหญ่มีอยู่ที่นี่ซึ่งรวมถึงคำอธิบายของรายการต่าง ๆ ในตาราง
ชุดการเปรียบเทียบนี้เปรียบเทียบประสิทธิภาพของ mPack กับการใช้งานอื่น ๆ ของรูปแบบการทำให้เป็นอนุกรม schemaless MPack มีประสิทธิภาพสูงกว่าไลบรารี JSON และ MessagePack ทั้งหมด (ยกเว้น CWPack) และในการทดสอบบางครั้ง MPACK นั้นเร็วกว่า RapidJSON หลายเท่าสำหรับข้อมูลที่เทียบเท่า
แนวคิด MessagePack เก็บข้อมูลคล้ายกับ JSON: พวกเขาทั้งคู่ประกอบด้วยค่าง่าย ๆ เช่นตัวเลขและสตริงจัดเก็บตามลำดับชั้นในแผนที่และอาร์เรย์ แล้วทำไมไม่ใช้ JSON แทน? เหตุผลหลักคือ JSON ได้รับการออกแบบให้เป็นมนุษย์ที่สามารถอ่านได้ดังนั้นจึงไม่ได้มีประสิทธิภาพเท่ากับรูปแบบการทำให้เป็นอนุกรมแบบไบนารี:
ประเภทสารประกอบเช่นสตริงแผนที่และอาร์เรย์จะถูกคั่นด้วยการจัดเก็บที่เหมาะสมจึงไม่สามารถจัดสรรล่วงหน้าได้ วัตถุทั้งหมดจะต้องแยกวิเคราะห์เพื่อกำหนดขนาดของมัน
สตริงจะไม่ถูกเก็บไว้ในการเข้ารหัสแบบดั้งเดิม อักขระพิเศษเช่นคำพูดและแบ็คสแลชจะต้องหลบหนีเมื่อเขียนและแปลงกลับเมื่ออ่าน
ตัวเลขนั้นไม่มีประสิทธิภาพโดยเฉพาะอย่างยิ่ง (โดยเฉพาะอย่างยิ่งเมื่อแยกการลอยกลับ) ทำให้ JSON ไม่เหมาะสมเป็นรูปแบบพื้นฐานสำหรับข้อมูลที่มีโครงสร้างที่มีตัวเลขจำนวนมาก
ข้อมูลไบนารีไม่ได้รับการสนับสนุนโดย JSON เลย blobs ไบนารีขนาดเล็กเช่นไอคอนและรูปขนาดย่อจะต้องมีการเข้ารหัส base64 หรือผ่านวงดนตรี
ปัญหาข้างต้นเพิ่มความซับซ้อนของตัวถอดรหัสอย่างมาก ตัวถอดรหัส JSON ที่มีคุณสมบัติเต็มรูปแบบมีขนาดค่อนข้างใหญ่และตัวถอดรหัสที่น้อยที่สุดมักจะทิ้งคุณสมบัติเช่นการแยกสตริงและการแยกวิเคราะห์แบบลอยตัวแทนที่จะปล่อยให้สิ่งเหล่านี้ไปยังผู้ใช้หรือแพลตฟอร์ม สิ่งนี้สามารถนำไปสู่ข้อบกพร่องเฉพาะแพลตฟอร์มที่หายากและเฉพาะสถานที่รวมถึงศักยภาพที่มากขึ้นสำหรับช่องโหว่ความปลอดภัย นอกจากนี้ยังลดประสิทธิภาพอย่างมีนัยสำคัญทำให้ JSON ไม่น่าสนใจสำหรับใช้ในแอปพลิเคชันเช่นเกมมือถือ
ในขณะที่ความไร้ประสิทธิภาพของพื้นที่ของ JSON สามารถลดลงได้บางส่วนผ่านการลดขนาดและการบีบอัด แต่ความไร้ประสิทธิภาพของประสิทธิภาพไม่สามารถทำได้ ที่สำคัญหากคุณกำลังลดและบีบอัดข้อมูลแล้วทำไมต้องใช้รูปแบบที่มนุษย์อ่านได้ตั้งแต่แรก?
กระบวนการสร้าง mpack ไม่ได้สร้าง mpack ลงในห้องสมุด มันถูกใช้เพื่อสร้างและเรียกใช้การทดสอบหน่วย คุณไม่จำเป็นต้องสร้าง mpack หรือชุดทดสอบหน่วยเพื่อใช้ mpack
ดู test/readme.md สำหรับข้อมูลเกี่ยวกับวิธีการทดสอบ mpack