序列化框架-msgpack

官網(wǎng)

https://msgpack.org/

It's like JSON.but fast and small.

說明

msg-pack-info.png

MessagePack 是一個高效的二進(jìn)制序列化格式。它讓你像JSON一樣可以在各種語言之間交換數(shù)據(jù)。但是它比JSON更快、更小。小的整數(shù)會被編碼成一個字節(jié),短的字符串僅僅只需要比它的長度多一字節(jié)的大小。

原有json長度:27 byte
msgPack長度:18 byte

壓縮原理

官方說明

布爾

bool 值可以用1byte表示

false:
+--------+
|  0xc2  |
+--------+

true:
+--------+
|  0xc3  |
+--------+

無長度

第一個字節(jié)特定標(biāo)識

int 8 stores a 8-bit signed integer
+--------+--------+
|  0xd0  |ZZZZZZZZ|
+--------+--------+

int 16 stores a 16-bit big-endian signed integer
+--------+--------+--------+
|  0xd1  |ZZZZZZZZ|ZZZZZZZZ|
+--------+--------+--------+

int 32 stores a 32-bit big-endian signed integer
+--------+--------+--------+--------+--------+
|  0xd2  |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|
+--------+--------+--------+--------+--------+

int 64 stores a 64-bit big-endian signed integer
+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|  0xd3  |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|
+--------+--------+--------+--------+--------+--------+--------+--------+--------+

不定長

主要是字符串、數(shù)組、二進(jìn)制數(shù)據(jù)等

fixstr stores a byte array whose length is upto 31 bytes:
+--------+========+
|101XXXXX|  data  |
+--------+========+

str 8 stores a byte array whose length is upto (2^8)-1 bytes:
+--------+--------+========+
|  0xd9  |YYYYYYYY|  data  |
+--------+--------+========+

str 16 stores a byte array whose length is upto (2^16)-1 bytes:
+--------+--------+--------+========+
|  0xda  |ZZZZZZZZ|ZZZZZZZZ|  data  |
+--------+--------+--------+========+

str 32 stores a byte array whose length is upto (2^32)-1 bytes:
+--------+--------+--------+--------+--------+========+
|  0xdb  |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA|  data  |
+--------+--------+--------+--------+--------+========+

高級結(jié)構(gòu)

MAP結(jié)構(gòu)

fixmap stores a map whose length is upto 15 elements
+--------+~~~~~~~~~~~~~~~~~+
|1000XXXX|   N*2 objects   |
+--------+~~~~~~~~~~~~~~~~~+

map 16 stores a map whose length is upto (2^16)-1 elements
+--------+--------+--------+~~~~~~~~~~~~~~~~~+
|  0xde  |YYYYYYYY|YYYYYYYY|   N*2 objects   |
+--------+--------+--------+~~~~~~~~~~~~~~~~~+

map 32 stores a map whose length is upto (2^32)-1 elements
+--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+
|  0xdf  |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|   N*2 objects   |
+--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+

where
* XXXX is a 4-bit unsigned integer which represents N
* YYYYYYYY_YYYYYYYY is a 16-bit big-endian unsigned integer which represents N
* ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ is a 32-bit big-endian unsigned integer which represents N
* N is the size of a map
* odd elements in objects are keys of a map
* the next element of a key is its associated value

使用

導(dǎo)入包

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.msgpack:msgpack-core:(version)'
}

數(shù)據(jù)打包

        try {
            MessageBufferPacker packer = MessagePack.newDefaultBufferPacker();
            packer
                .packInt(1)
                .packString("leo");
            // pack arrays
            int[] arr = new int[] {3, 5, 1, 0, -1, 255};
            packer.packArrayHeader(arr.length);
            for (int v : arr) {
                packer.packInt(v);
            }
            // pack map (key -> value) elements
            // the number of (key, value) pairs
            packer.packMapHeader(2);
            // Put "apple" -> 1
            packer.packString("apple");
            packer.packInt(1);
            // Put "banana" -> 2
            packer.packString("banana");
            packer.packInt(2);

            // pack binary data
            byte[] ba = new byte[] {1, 2, 3, 4};
            packer.packBinaryHeader(ba.length);
            packer.writePayload(ba);

            packer.close();

        } catch (IOException e) {

        }

如何對上面的數(shù)據(jù)解包呢

            MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(packer.toMessageBuffer().array());
            int id = unpacker.unpackInt();
            String name = unpacker.unpackString();
            System.out.print(id);
            System.out.print(name);
            int numPhones = unpacker.unpackArrayHeader();
            String[] phones = new String[numPhones];
            for (int i = 0; i < numPhones; ++i) {
                phones[i] = unpacker.unpackString();
            }
            int maplen = unpacker.unpackMapHeader();
            for (int j = 0; j < maplen; j++) {
                unpacker.unpackString();
                unpacker.unpackInt();
            }
            unpacker.close();

打包POJO

官方推薦使用 msgpack-jackson

導(dǎo)包

dependencies {
    compile 'org.msgpack:jackson-dataformat-msgpack:0.8.20'
}

實體類

    public static class MyMessage implements Serializable {

        public String name;
        public double version;

        public MyMessage(String name, double version) {
            this.name = name;
            this.version = version;
        }

        public MyMessage(){}
    }

按照官方文檔寫打包/解包代碼

            ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory());
            MyMessage myMessage = new MyMessage("remer", 1111);
            byte[] bytes = objectMapper.writeValueAsBytes(myMessage);

            MyMessage deserialized = objectMapper.readValue(bytes, MyMessage.class);
            System.out.print(deserialized.name);

結(jié)論

  1. MsgPack產(chǎn)生的數(shù)據(jù)更小,從而在數(shù)據(jù)傳輸過程中網(wǎng)絡(luò)壓力更小
  2. MsgPack兼容性差,必須按照順序保存字段
  3. MsgPack是二進(jìn)制序列化格式,兼容跨語言

參考

msgpack
Quick Start msgpack
msgpack-jackson
Java JSON Tutorial
msgpack簡介和使用
MsgPack是何方神圣

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容