MessagePack (de)serializer implementation for Erlang / msgpack.org[Erlang]
Go to file
UENISHI Kota 3d03320a45 Merge pull request #37 from zerth/adjust-ext-type-code-check
Adjust ext type code handling to match spec
2015-03-11 22:24:35 +09:00
include Fix Dialyzer invalid contract warning 2014-11-12 18:52:50 +03:00
src Merge pull request #37 from zerth/adjust-ext-type-code-check 2015-03-11 22:24:35 +09:00
test Merge pull request #37 from zerth/adjust-ext-type-code-check 2015-03-11 22:24:35 +09:00
.gitignore update .gitignore 2013-02-18 05:07:51 +09:00
.travis.yml Add OTP 17 series 2015-03-11 22:14:09 +09:00
AUTHORS @iced for #33, fixes #31 2014-05-29 20:03:30 +09:00
dialyzer.ignore-warnings fix some dialyzing 2014-01-18 01:14:53 +09:00
LICENSE-2.0.txt add license terms and a bit cosme 2011-05-02 17:29:00 +09:00
Makefile fix some dialyzing 2014-01-18 01:14:53 +09:00
README.md bump version (twice) 2014-04-15 08:54:24 +09:00
rebar update rebar 2013-02-02 21:00:35 +09:00
rebar.config deprecate R14 because of -callback for behaviour and added 17.0 2014-04-10 01:11:00 +09:00
rebar.config.script R16 or earlier with compile option 2014-04-10 22:35:31 +09:00

MessagePack Erlang

Travis

Drone.io

prequisites for runtime

Erlang/OTP, >= R15B -- for older version, rebar won't work. Also based on the new msgpack spec 232a0d.

edit rebar.config to use in your application

{deps, [
  {msgpack, ".*",
    {git, "git://github.com/msgpack/msgpack-erlang.git", "master"}}
]}.

Simple deserialization

Ham = msgpack:pack(Spam),
{ok, Spam} = msgpack:unpack(Ham).

Stream deserialization

{Term0, Rest0} = msgpack:unpack_stream(Binary),
{Term1, Rest1} = msgpack:unpack_stream(Rest0),
...

String type

Now this supports string type!

Opt = [{enable_str, true}]
{ok, "埼玉"} = msgpack:unpack(msgpack:pack("埼玉", Opt), Opt).
 => {ok,[22524,29577]}

There are several options for msgpack:pack/2 and msgpack:unpack/2 . See msgpack:options() in msgpack.hrl.

Map Style

Since Erlang/OTP 17.0

msgpack:pack(#{ <<"key">> => <<"value">> }, [{format, map}]).

Or use old jiffy/jsx style

msgpack:pack({[{<<"key">>, <<"value">>}]}, [{format, jiffy}]),
msgpack:pack([{<<"key">>, <<"value">>}], [{format, jsx}]).

Ext type

Now msgpack-erlang supports ext type. Now you can serialize everything with your original (de)serializer. That will enable us to handle erlang- native types like pid(), ref() contained in tuple(). See test/msgpack_ext_example_tests.erl for example code.

Packer = fun({ref, Ref}, Opt) when is_reference(Ref) -> {ok, {12, term_to_binary(Ref)}} end,
Unpacker = fun(12, Bin) -> {ok, {ref, binary_to_term(Bin)}} end,
Ref = make_ref(),
Opt = [{ext,{Packer,Unpacker}}],
{ok, {ref, Ref}} = msgpack:unpack(msgpack:pack({ref, Ref}, Opt), Opt).

This is still experimental feature, so I'm waiting for your feedback.

Compatibility mode

To use as same with old spec:

OldHam = msgpack:pack(Spam, [{enable_str,false}]),
{ok, Spam} = msgpack:unpack(OldHam, [{enable_str,false}]).

Since 0.2.3 now it's false by default.

Further tests

See msgpack-erlang-tests for further tests

License

Apache License 2.0

Release Notes

0.3.2

  • set back default style as jiffy
  • fix bugs around nil/null handling

0.3.0

  • supports map new in 17.0
  • jiffy-style maps will be deprecated in near future
  • set default style as map

0.2.8

0.2 series works with OTP 17.0, R16, R15, and with MessagePack's new and old format. But does not support map type introduced in OTP 17.0.

It also supports JSX-compatible mode.