官網(wǎng)
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é)論
- MsgPack產(chǎn)生的數(shù)據(jù)更小,從而在數(shù)據(jù)傳輸過程中網(wǎng)絡(luò)壓力更小
- MsgPack兼容性差,必須按照順序保存字段
- MsgPack是二進(jìn)制序列化格式,兼容跨語言
參考
msgpack
Quick Start msgpack
msgpack-jackson
Java JSON Tutorial
msgpack簡介和使用
MsgPack是何方神圣