小编Ell*_*ask的帖子

Haskell中的可扩展序列化

我正在尝试使用read和show进行序列化/反序列化(这本身不是问题),但在某种意义上可以扩展(但不能缩小)数据类型.

假设我有这种类型:

data Foo = { bar :: Int } deriving (Show, Read)
Run Code Online (Sandbox Code Playgroud)

列表:

foos = [Foo 1, Foo 2]
Run Code Online (Sandbox Code Playgroud)

我可以轻松地将其反序列化为一个文件:

hPutStrLn fileHand . ppShow $ foos
Run Code Online (Sandbox Code Playgroud)

然后我可以序列化它:

!str <- hGetContents fileHand
let foosFromFile = fromMaybe [] $ (readMaybe :: String -> Maybe [Foo]) str
Run Code Online (Sandbox Code Playgroud)

但是假设几个月后我想在Foo类型中添加一个'baz'字段.旧格式文件的直接序列化将不再适用于读取,我将需要转换文件(我真的不想要).

那么,是否有一个优雅的(没有在程序本身中放置明确的版本控制逻辑)解决方案仍然序列化文件中的数据,并用默认值填充缺少的字段?也许某些类型的技巧?

谢谢.

serialization haskell types deserialization

5
推荐指数
2
解决办法
319
查看次数

标签 统计

deserialization ×1

haskell ×1

serialization ×1

types ×1