Safecopy 从字符串迁移到字节串
Safecopy migrating from string to bytestring
我正在尝试使用 safecopy haskell 库,但是当我尝试将字符串迁移到字节串时,最后 4 个字符丢失并且 4 个 '\NULL' 字符被添加到前面到字符串:
{-# LANGUAGE TemplateHaskell, DeriveDataTypeable, TypeFamilies #-}
import Data.SafeCopy
import Data.Acid
import Data.Typeable
import Control.Monad.State.Class
import Control.Monad.Reader.Class
data T = T { str :: String }
deriving (Show, Typeable)
getT :: Query T String
getT = fmap str ask
setT :: String -> Update T ()
setT str = put $ T str
deriveSafeCopy 0 'base ''T
makeAcidic ''T ['setT, 'getT]
main :: IO ()
main = do
state <- openLocalState (T "string set with default")
update state (SetT "string set with SetT")
str <- query state GetT
putStrLn str
这输出:string set with SetT
,但是当你运行之后的以下修改版本:
{-# LANGUAGE TemplateHaskell, DeriveDataTypeable, TypeFamilies #-}
import Data.SafeCopy
import Data.Acid
import Data.Typeable
import Control.Monad.State.Class
import Control.Monad.Reader.Class
import Data.ByteString.Char8 as B
data T_v0 = T_v0 String
deriving (Show, Typeable)
deriveSafeCopy 0 'base ''T_v0
data T = T { str :: B.ByteString }
deriving (Show, Typeable)
deriveSafeCopy 1 'extension ''T
instance Migrate T where
type MigrateFrom T = T_v0
migrate (T_v0 str) = T $ B.pack str
getT :: Query T B.ByteString
getT = fmap str ask
setT :: B.ByteString -> Update T ()
setT str = put $ T str
makeAcidic ''T ['setT, 'getT]
main :: IO ()
main = do
state <- openLocalState (T $ B.pack "bytestring set with default")
str <- query state GetT
print str
它输出:"\NUL\NUL\NUL\NULstring set with "
。我不知道为什么会这样。我在迁移步骤中做错了什么吗?我尽量靠近 example code。有谁知道为什么会这样?
P.S:抱歉,代码量太大,但我想不出更好的方式来表达问题。
因为acid-state
。您更改了实现之间的 getT
和 setT
类型,这弄乱了事务日志。如果不先使用 createCheckpoint
清除事务日志(使用旧版本的代码库),您基本上无法更改使用 makeAcidic
标记的任何函数。
我正在尝试使用 safecopy haskell 库,但是当我尝试将字符串迁移到字节串时,最后 4 个字符丢失并且 4 个 '\NULL' 字符被添加到前面到字符串:
{-# LANGUAGE TemplateHaskell, DeriveDataTypeable, TypeFamilies #-}
import Data.SafeCopy
import Data.Acid
import Data.Typeable
import Control.Monad.State.Class
import Control.Monad.Reader.Class
data T = T { str :: String }
deriving (Show, Typeable)
getT :: Query T String
getT = fmap str ask
setT :: String -> Update T ()
setT str = put $ T str
deriveSafeCopy 0 'base ''T
makeAcidic ''T ['setT, 'getT]
main :: IO ()
main = do
state <- openLocalState (T "string set with default")
update state (SetT "string set with SetT")
str <- query state GetT
putStrLn str
这输出:string set with SetT
,但是当你运行之后的以下修改版本:
{-# LANGUAGE TemplateHaskell, DeriveDataTypeable, TypeFamilies #-}
import Data.SafeCopy
import Data.Acid
import Data.Typeable
import Control.Monad.State.Class
import Control.Monad.Reader.Class
import Data.ByteString.Char8 as B
data T_v0 = T_v0 String
deriving (Show, Typeable)
deriveSafeCopy 0 'base ''T_v0
data T = T { str :: B.ByteString }
deriving (Show, Typeable)
deriveSafeCopy 1 'extension ''T
instance Migrate T where
type MigrateFrom T = T_v0
migrate (T_v0 str) = T $ B.pack str
getT :: Query T B.ByteString
getT = fmap str ask
setT :: B.ByteString -> Update T ()
setT str = put $ T str
makeAcidic ''T ['setT, 'getT]
main :: IO ()
main = do
state <- openLocalState (T $ B.pack "bytestring set with default")
str <- query state GetT
print str
它输出:"\NUL\NUL\NUL\NULstring set with "
。我不知道为什么会这样。我在迁移步骤中做错了什么吗?我尽量靠近 example code。有谁知道为什么会这样?
P.S:抱歉,代码量太大,但我想不出更好的方式来表达问题。
因为acid-state
。您更改了实现之间的 getT
和 setT
类型,这弄乱了事务日志。如果不先使用 createCheckpoint
清除事务日志(使用旧版本的代码库),您基本上无法更改使用 makeAcidic
标记的任何函数。