# 0. Understanding The Structure ====
JSON, 40 Bytes UTF-8
----------------------------------------------
| {"name":"John Doe","age":12} |
----------------------------------------------
| {" | 7B 22 |
| name | 6E 61 6D 65 |
| ":" | 22 3A 22 |
| John Doe | 4A 6F 68 6E 20 44 6F 65 |
| "," | 22 2C 22 |
| age | 61 67 65 |
| ": | 22 3A 20 |
| 12 | 31 32 |
| } | 7D |
----------------------------------------------
MessagePack, 27 Bytes UTF-8
----------------------------------------------
| ‚¤name¨John Doe£age.12 |
----------------------------------------------
| ‚¤ | 82 84 |
| name | 6E 61 6D 65 |
| ¨ | A8 |
| John Doe | 4A 6F 68 6E 20 44 6F 65 |
| £ | A3 |
| age | 61 67 65 |
| . | 0C |
| 12 | 31 32 |
----------------------------------------------
# 1. JAVA ====
""" Installing with Maven
"""
...
org.msgpack
msgpack
${msgpack.version}
...
""" Simple Serialization/Deserialization
"""
// Create serialize objects.
List src = new ArrayList();
src.add("msgpack");
src.add("kumofs");
MessagePack msgpack = new MessagePack();
// Serialize
byte[] raw = msgpack.write(src);
// Deserialize directly using a template
List dst1 = msgpack.read(raw, Templates.tList(Templates.TString));
System.out.println(dst1.get(0));
System.out.println(dst1.get(1));
// Or, Deserialze to Value then convert type.
Value dynamic = msgpack.read(raw);
List dst2 = new Converter(dynamic)
.read(Templates.tList(Templates.TString));
System.out.println(dst2.get(0));
System.out.println(dst2.get(1));
# 2. RUBY ====
""" Installing the Gem
"""
gem install msgpack
""" Streaming API
"""
# serialize a 2-element array [e1, e2]
pk = MessagePack::Packer.new(io)
pk.write_array_header(2).write(e1).write(e2).flush
# deserialize objects from an IO
u = MessagePack::Unpacker.new(io)
u.each { |obj| ... }
# event-driven deserialization
def on_read(data)
@u ||= MessagePack::Unpacker.new
@u.feed_each(data) { |obj| ... }
end
# 3. NODE.JS ====
""" Installing with NPM
"""
npm install msgpack5 --save
""" Using in Node
"""
var msgpack = require('msgpack5')() // namespace our extensions
, a = new MyType(2, 'a')
, encode = msgpack.encode
, decode = msgpack.decode
msgpack.register(0x42, MyType, mytipeEncode, mytipeDecode)
console.log(encode({ 'hello': 'world' }).toString('hex'))
// 81a568656c6c6fa5776f726c64
console.log(decode(encode({ 'hello': 'world' })))
// { hello: 'world' }
console.log(encode(a).toString('hex'))
// d5426161
console.log(decode(encode(a)) instanceof MyType)
// true
console.log(decode(encode(a)))
// { value: 'a', size: 2 }
function MyType(size, value) {
this.value = value
this.size = size
}
function mytipeEncode(obj) {
var buf = new Buffer(obj.size)
buf.fill(obj.value)
return buf
}
function mytipeDecode(data) {
var result = new MyType(data.length, data.toString('utf8', 0, 1))
, i
for (i = 0; i < data.length; i++) {
if (data.readUInt8(0) != data.readUInt8(i)) {
throw new Error('should all be the same')
}
}
return result
}