diff --git a/casadi-bindings.cabal b/casadi-bindings.cabal
--- a/casadi-bindings.cabal
+++ b/casadi-bindings.cabal
@@ -1,5 +1,5 @@
 name:                casadi-bindings
-version:             2.2.0.5
+version:             2.2.0.6
 synopsis:            mid-level bindings to CasADi
 category:            Numerical, Math
 description:
@@ -58,6 +58,7 @@
                        linear,
                        vector,
                        containers,
+                       cereal,
                        casadi-bindings-internal == 0.1.2.1,
                        casadi-bindings-core     == 2.2.0.2
   default-language:    Haskell2010
diff --git a/src/Casadi/DMatrix.hs b/src/Casadi/DMatrix.hs
--- a/src/Casadi/DMatrix.hs
+++ b/src/Casadi/DMatrix.hs
@@ -9,15 +9,30 @@
 import qualified Data.Vector as V
 import System.IO.Unsafe ( unsafePerformIO )
 import Linear.Conjugate ( Conjugate(..) )
+import Data.Serialize ( Serialize(..) )
 
 import Casadi.Core.Classes.DMatrix
+import Casadi.Core.Classes.Sparsity ( Sparsity )
 import qualified Casadi.Core.Tools as C
 
 import Casadi.Overloading ( Fmod(..), ArcTan2(..), SymOrd(..), Erf(..) )
 import Casadi.CMatrix ( CMatrix(..) )
 
+instance Serialize DMatrix where
+  get = do
+    sp <- get
+    data' <- get
+    return (fromSparseData sp (V.fromList data'))
+  put x = do
+    put (sparsity x)
+    put (V.toList (ddata x))
+
 instance Conjugate DMatrix where
   conjugate = id
+
+fromSparseData :: Sparsity -> V.Vector Double -> DMatrix
+fromSparseData s d = unsafePerformIO (dmatrix__6 s d)
+{-# NOINLINE fromSparseData #-}
 
 dsparsify :: DMatrix -> DMatrix
 dsparsify x = unsafePerformIO (dmatrix_zz_sparsify__0 x)
diff --git a/src/Casadi/Sparsity.hs b/src/Casadi/Sparsity.hs
--- a/src/Casadi/Sparsity.hs
+++ b/src/Casadi/Sparsity.hs
@@ -4,15 +4,21 @@
        ( Sparsity
        , upper, lower, spy, spyMatlab
        , dense, sparse, scalar
+       , compress, compressed
        ) where
 
 import qualified Data.Vector as V
 import System.IO.Unsafe ( unsafePerformIO )
+import Data.Serialize ( Serialize(..) )
 
 import Casadi.Core.Classes.Sparsity
 
 import Casadi.SharedObject ( castSharedObject )
 
+instance Serialize Sparsity where
+  put = put . V.toList . compress
+  get = fmap (compressed . V.fromList) get
+
 instance Show Sparsity where
   show x = show (castSharedObject x)
   {-# NOINLINE show #-}
@@ -46,3 +52,11 @@
 dense :: Int -> Int -> Sparsity
 dense nr nc = unsafePerformIO (sparsity_dense__1 nr nc)
 {-# NOINLINE dense #-}
+
+compress :: Sparsity -> V.Vector Int
+compress s = unsafePerformIO (sparsity_compress s)
+{-# NOINLINE compress #-}
+
+compressed :: V.Vector Int -> Sparsity
+compressed v = unsafePerformIO (sparsity_compressed v)
+{-# NOINLINE compressed #-}
