首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字符串到字节串的安全迁移

从字符串到字节串的安全迁移
EN

Stack Overflow用户
提问于 2015-05-19 15:58:41
回答 1查看 76关注 0票数 3

我试图使用安全车 haskell库,但当我尝试将字符串迁移到字节字符串时,最后4个字符丢失,4个'\NULL‘字符被添加到字符串中:

代码语言:javascript
复制
{-# 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,但是在运行以下修改后的版本时:

代码语言:javascript
复制
{-# 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 "。我不知道为什么会这样。我在迁移步骤中做错什么了吗?我已经试着尽可能靠近示例代码了。有人知道为什么会这样吗?

对不起,代码太多了,但我想不出有什么更好的方法来表达这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-19 16:29:30

这是因为acid-state。您已经在两种实现之间更改了getTsetT的类型,这会扰乱事务日志。如果不首先使用makeAcidic清除事务日志(使用较早版本的代码基),基本上不能更改使用createCheckpoint标记的任何函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30330550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档