@@ -32,6 +32,7 @@ module Streamly.Data.Serialize
3232
3333#include "assert.hs"
3434
35+import Data.Int (Int64)
3536import Data.Word (Word8)
3637import Streamly.Internal.Data.Array.Type (Array(..))
3738import Streamly.Internal.Data.Serialize (Serialize(..), Size(..))
@@ -62,9 +63,12 @@ encodeAs ps a =
6263 case size :: Size a of
6364 ConstSize sz -> sz
6465 VarSize f -> f a
65− mbarr <- Unbox.newBytesAs ps len
66− nextOff <- serialize 0 mbarr a
67− assertM(nextOff == len)
66+ -- We encode the length of the encoding as a header hence the 8 extra
67+ -- bytes to encode Int64
68+ mbarr <- Unbox.newBytesAs ps (8 + len)
69+ off1 <- serialize 0 mbarr (fromIntegral len :: Int64)
70+ off2 <- serialize off1 mbarr a
71+ assertM(off2 == len + off1)
6872 pure $ Array mbarr 0 len
6973
7074{-# INLINE encode #-}
@@ -82,7 +86,9 @@ pinnedEncode = encodeAs Pinned
8286{-# INLINE decode #-}
8387decode :: Serialize a => Array Word8 -> a
8488decode arr@(Array {..}) = unsafeInlineIO $ do
85− let len = Array.length arr
86− (nextOff, val) <- deserialize 0 arrContents
87− assertM(nextOff == len)
89+ let lenArr = Array.length arr
90+ (off1, lenEncoding :: Int64) <- deserialize 0 arrContents
91+ (off2, val) <- deserialize off1 arrContents
92+ assertM(fromIntegral lenEncoding + off1 == off2)
93+ assertM(lenArr == off2)
8894 pure val