Module msgpack¶
The msgpack
module takes strings in MsgPack format and decodes them, or
takes a series of non-MsgPack values and encodes them.
-
msgpack.
encode
(lua_value)¶ Convert a Lua object to a MsgPack string.
Parameters: - lua_value – either a scalar value or a Lua table value.
Return: the original value reformatted as a MsgPack string.
Rtype: string
-
msgpack.
decode
(string)¶ Convert a MsgPack string to a Lua object.
Parameters: - string – a string formatted as MsgPack.
- the original contents formatted as a Lua table;
- the number of bytes that were decoded.
Rtype: lua object
-
msgpack.
NULL
¶ A value comparable to Lua “nil” which may be useful as a placeholder in a tuple.
Example¶
tarantool> msgpack = require('msgpack')
---
...
tarantool> y = msgpack.encode({'a',1,'b',2})
---
...
tarantool> z = msgpack.decode(y)
---
...
tarantool> z[1], z[2], z[3], z[4]
---
- a
- 1
- b
- 2
...
tarantool> box.space.tester:insert{20, msgpack.NULL, 20}
---
- [20, null, 20]
...
The MsgPack output structure can be specified with __serialize
:
__serialize = "seq" or "sequence"
for an array__serialize = "map" or "mapping"
for a map
Serializing ‘A’ and ‘B’ with different __serialize
values causes different
results. To show this, here is a routine which encodes {‘A’,’B’} both as an
array and as a map, then displays each result in hexadecimal.
function hexdump(bytes)
local result = ''
for i = 1, #bytes do
result = result .. string.format("%x", string.byte(bytes, i)) .. ' '
end
return result
end
msgpack = require('msgpack')
m1 = msgpack.encode(setmetatable({'A', 'B'}, {
__serialize = "seq"
}))
m2 = msgpack.encode(setmetatable({'A', 'B'}, {
__serialize = "map"
}))
print('array encoding: ', hexdump(m1))
print('map encoding: ', hexdump(m2))
Result:
array encoding: 92 a1 41 a1 42 map encoding: 82 01 a1 41 02 a1 42
The MsgPack Specification page explains that the first encoding means:
fixarray(2), fixstr(1), "A", fixstr(1), "B"
and the second encoding means:
fixmap(2), key(1), fixstr(1), "A", key(2), fixstr(2), "B".
Here are examples for all the common types, with the Lua-table representation on the left, with the MsgPack format name and encoding on the right.
Common Types and MsgPack Encodings
{} | ‘fixmap’ if metatable is ‘map’ = 80 otherwise ‘fixarray’ = 90 |
‘a’ | ‘fixstr’ = a1 61 |
false | ‘false’ = c2 |
true | ‘true’ = c3 |
127 | ‘positive fixint’ = 7f |
65535 | ‘uint 16’ = cd ff ff |
4294967295 | ‘uint 32’ = ce ff ff ff ff |
nil | ‘nil’ = c0 |
msgpack.NULL | same as nil |
[0] = 5 | ‘fixmap(1)’ + ‘positive fixint’ (for the key) + ‘positive fixint’ (for the value) = 81 00 05 |
[0] = nil | ‘fixmap(0)’ = 80 – nil is not stored when it is a missing map value |
1.5 | ‘float 64’ = cb 3f f8 00 00 00 00 00 00 |
Also, some MsgPack configuration settings for encoding can be changed, in the same way that they can be changed for JSON.