Serialize an Elixir pid
I was wondering how to serialize/deserialize a pid for some tricks with Ecto Sandbox and I found out some nice code on phoenix_ecto
code. Here it goes my version:
defmodule MyApp.Serializer do
@spec serialize(term) :: binary
def serialize(term) do
term
|> :erlang.term_to_binary()
|> Base.url_encode64()
end
@spec deserialize(binary) :: term
def deserialize(str) when is_binary(str) do
str
|> Base.url_decode64!()
|> :erlang.binary_to_term()
end
end
And the test:
defmodule MyApp.SerializerTest do
use ExUnit.Case, async: true
alias MyApp.Serializer
describe "serialize/1" do
test "serializes a pid" do
pid = self()
assert pid |> Serializer.serialize() |> is_binary()
end
test "serializes a map" do
map = %{foo: :bar}
assert map |> Serializer.serialize() |> is_binary()
end
end
describe "serialize/1, deserialize/1" do
test "serializes and deserializes a pid" do
pid = self()
assert pid |> Serializer.serialize() |> Serializer.deserialize() == pid
end
test "serializes and deserializes a map" do
map = %{foo: :bar}
assert map |> Serializer.serialize() |> Serializer.deserialize() == map
end
end
end
Tweet