我正在尝试为Store
调整Streaming
编码和解码。 Store
已经使用名为decodeMessageBS
的函数实现了流decode
。
我尝试为store
执行Streaming
反序列化的基本实现,如下所示(暂时没有bracket
,以保持简单)。但是,popper
的逻辑似乎有问题,因为decodeMessageBS
不断投掷PeekException
:
{-# LANGUAGE RankNTypes #-}
import Streaming.Prelude as S hiding (print,show)
import Data.IORef
import Streaming as S
import qualified Data.ByteString as BS (ByteString,empty,length)
import System.IO.ByteBuffer
import Data.Store
import Data.Store.Streaming
streamDecode :: forall a. (Store a) => ByteBuffer -> Stream (Of BS.ByteString) IO () -> Stream (Of a) IO ()
streamDecode bb inp = do
ref <- lift $ newIORef inp
let popper = do
r <- S.uncons =<< readIORef ref
case r of
Nothing -> return Nothing
Just (a,rest) -> writeIORef ref rest >> return (Just a)
let go = do
r <- lift $ decodeMessageBS bb $ popper
lift $ print "Decoding"
case r of
Nothing -> return ()
Just msg -> (lift $ print "Message found") >> (S.yield . fromMessage $ msg) >> go
go
我可以使用decodeIOPortionWith
解码我的测试文件 - 所以,问题似乎在于提供decodeMessageBS
所需的逻辑。将会对这里popper
的逻辑错误提出一些指示。
答案 0 :(得分:0)
发生PeekException
因为Store
在以流媒体模式保存邮件时使用不同的格式,与Binary
不同。在使用Message
函数时,它期望在Store
数据周围使用decodeMessageBS
类型的包装器。 decodeIOPortionWith
不期望Message
包装器,因此可以正常使用已保存的Store
数据。修复序列化以将数据保存为Message
编码后,decodeMessageBS
在该数据上运行良好。