Dumbo (Dumbo v0.3.1)

Copy Markdown View Source

An encoder and decoder for the PHP serialisation format.

Dumbo allows you to serialise Elixir data structures into PHP's serialisation format and deserialise PHP serialised strings back into Elixir terms.

Numeric-float decoding can optionally be offloaded to the companion dumbo_nif library, a precompiled Rust NIF. Add it as a dependency to speed up float-heavy payloads; see Dumbo.DecodeOpts for the :use_native_decoders option. Dumbo works without it.

Summary

Functions

Deserialises a PHP serialised string into an Elixir term.

Serializes an Elixir term into a PHP serialised binary string.

Serializes an Elixir term into iodata representing the PHP serialised format.

Functions

decode(source, opts \\ %Dumbo.DecodeOpts{})

@spec decode(source :: binary(), opts :: Dumbo.DecodeOpts.t()) :: term()

Deserialises a PHP serialised string into an Elixir term.

Accepts an optional %Dumbo.DecodeOpts{} struct. See Dumbo.DecodeOpts.

Common PHP classes are resolved into native Elixir types automatically; see Dumbo.PHP.

Examples

iex> Dumbo.decode("i:42;")
42

iex> Dumbo.decode(~s's:5:"hello";')
"hello"

iex> Dumbo.decode("b:1;")
true

iex> Dumbo.decode("b:0;")
false

iex> Dumbo.decode("N;")
nil

iex> Dumbo.decode(~s'a:2:{i:0;s:3:"foo";i:1;s:3:"bar";}')
%{0 => "foo", 1 => "bar"}

iex> Dumbo.decode(~s'O:8:"stdClass":1:{s:3:"foo";s:3:"bar";}')
%{"foo" => "bar"}

iex> opts = %Dumbo.DecodeOpts{object_resolvers: %{}}
iex> Dumbo.decode(~s'O:8:"stdClass":1:{s:3:"foo";s:3:"bar";}', opts)
{:object, "stdClass", %{"foo" => "bar"}}

iex> opts = %Dumbo.DecodeOpts{object_resolvers: %{"stdClass" => fn obj -> obj end}}
iex> Dumbo.decode(~s'O:8:"stdClass":1:{s:3:"foo";s:3:"bar";}', opts)
%{"foo" => "bar"}

encode(term, opts \\ %Dumbo.EncodeOpts{})

@spec encode(term :: term(), opts :: Dumbo.EncodeOpts.t()) :: binary()

Serializes an Elixir term into a PHP serialised binary string.

Accepts an optional %Dumbo.EncodeOpts{} struct to configure encoding behavior.

Examples

iex> Dumbo.encode(42)
"i:42;"

iex> Dumbo.encode("hello")
~s's:5:"hello";'

iex> Dumbo.encode(true)
"b:1;"

iex> Dumbo.encode(false)
"b:0;"

iex> Dumbo.encode(nil)
"N;"

iex> Dumbo.encode([1, 2, 3])
"a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}"

iex> Dumbo.encode(%{"foo" => "bar"})
~s'a:1:{s:3:"foo";s:3:"bar";}'

encode_to_iodata(term, opts \\ %Dumbo.EncodeOpts{})

@spec encode_to_iodata(term :: term(), opts :: Dumbo.EncodeOpts.t()) :: iodata()

Serializes an Elixir term into iodata representing the PHP serialised format.

Accepts an optional %Dumbo.EncodeOpts{} struct to configure encoding behavior.

Examples

iex> Dumbo.encode_to_iodata(42)
["i:", "42", ?;]

iex> Dumbo.encode_to_iodata("hello")
["s:", "5", ~s':"', "hello", ~s'";']

iex> Dumbo.encode_to_iodata(42) |> IO.iodata_to_binary()
"i:42;"