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
@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"}
@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";}'
@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;"