1- # ## Py
2- #
3- # We use pickle to serialise Python objects to bytes.
1+ module Serialization
2+
3+ using ... PythonCall
4+ using ... Core: pyisnull, pybytes_asvector, pynew
5+
6+ using Serialization: Serialization as S
47
58_pickle_module () = pyimport (get (ENV , " JULIA_PYTHONCALL_PICKLE" , " pickle" ))
69
710function serialize_py (s, x:: Py )
811 if pyisnull (x)
9- serialize (s, nothing )
12+ S . serialize (s, nothing )
1013 else
1114 b = _pickle_module (). dumps (x)
12- serialize (s, pybytes_asvector (b))
15+ S . serialize (s, pybytes_asvector (b))
1316 end
1417end
1518
1619function deserialize_py (s)
17- v = deserialize (s)
20+ v = S . deserialize (s)
1821 if v === nothing
1922 pynew ()
2023 else
2124 _pickle_module (). loads (pybytes (v))
2225 end
2326end
2427
25- function Serialization . serialize (s:: AbstractSerializer , x:: Py )
26- Serialization . serialize_type (s, Py, false )
28+ function S . serialize (s:: S. AbstractSerializer , x:: Py )
29+ S . serialize_type (s, Py, false )
2730 serialize_py (s, x)
2831end
2932
30- Serialization . deserialize (s:: AbstractSerializer , :: Type{Py} ) = deserialize_py (s)
33+ S . deserialize (s:: S. AbstractSerializer , :: Type{Py} ) = deserialize_py (s)
3134
3235# ## PyException
3336#
@@ -38,26 +41,27 @@ Serialization.deserialize(s::AbstractSerializer, ::Type{Py}) = deserialize_py(s)
3841# This means the user can install something like "tblib" to enable pickling of tracebacks
3942# and for free this enables serializing PyException including the traceback.
4043
41- function Serialization . serialize (s:: AbstractSerializer , x:: PyException )
42- Serialization . serialize_type (s, PyException, false )
44+ function S . serialize (s:: S. AbstractSerializer , x:: PyException )
45+ S . serialize_type (s, PyException, false )
4346 serialize_py (s, x. v)
4447end
4548
46- Serialization. deserialize (s:: AbstractSerializer , :: Type{PyException} ) =
47- PyException (deserialize_py (s))
49+ S. deserialize (s:: S.AbstractSerializer , :: Type{PyException} ) = PyException (deserialize_py (s))
4850
4951# ## PyArray
5052#
5153# This type holds a pointer and a handle (usually a python memoryview or capsule) which are
5254# not serializable by default, and even if they were would not be consistent after
5355# serializing each field independently. So we just serialize the wrapped Python object.
5456
55- function Serialization . serialize (s:: AbstractSerializer , x:: PyArray )
56- Serialization . serialize_type (s, typeof (x), false )
57+ function S . serialize (s:: S. AbstractSerializer , x:: PyArray )
58+ S . serialize_type (s, typeof (x), false )
5759 serialize_py (s, x. py)
5860end
5961
60- function Serialization . deserialize (s:: AbstractSerializer , :: Type{T} ) where {T<: PyArray }
62+ function S . deserialize (s:: S. AbstractSerializer , :: Type{T} ) where {T<: PyArray }
6163 # TODO : set buffer and array args too?
6264 T (deserialize_py (s); copy = false )
6365end
66+
67+ end
0 commit comments