我正在尝试使用 read 和 show 进行序列化/反序列化(这本身不是问题),但在某种意义上可以扩展数据类型可以扩展(但不能缩小)。
假设我有这种类型:
data Foo = { bar :: Int } deriving (Show, Read)
和清单:
foos = [Foo 1, Foo 2]
我可以轻松地将其反序列化为文件:
hPutStrLn fileHand . ppShow $ foos
然后我可以将它序列化回来:
!str <- hGetContents fileHand
let foosFromFile = fromMaybe [] $ (readMaybe :: String -> Maybe [Foo]) str
但是假设几个月后我想在 Foo 类型中添加一个“baz”字段。旧格式文件的直接序列化将不再适用于读取,我需要转换文件(我真的不想要)。
那么,是否有一种优雅的(没有在程序本身中放置明确的版本控制逻辑)的解决方案来仍然序列化文件中的数据,并用默认值填充缺失的字段?也许一些类型的技巧?
谢谢。