Haskell 序列化Data.Text的实例?

Haskell 序列化Data.Text的实例?,haskell,serialization,Haskell,Serialization,我需要将数据类型序列化到使用data.Text的磁盘,下面是一个示例: {-# LANGUAGE DeriveGeneric #-} import Data.Serialize (Serialize) import Data.Text (Text) import GHC.Generics data Foo = Foo Text deriving (Read, Show, Eq, Ord, Generic) instance Serialize Foo -- instance Serialize

我需要将数据类型序列化到使用
data.Text
的磁盘,下面是一个示例:

{-# LANGUAGE DeriveGeneric #-}
import Data.Serialize (Serialize)
import Data.Text (Text)
import GHC.Generics

data Foo = Foo Text deriving (Read, Show, Eq, Ord, Generic)
instance Serialize Foo
-- instance Serialize Text
如前所述,这将生成错误:

No instance for (Serialize Text)
  arising from a use of `Data.Serialize.$gdmput'
Possible fix: add an instance declaration for (Serialize Text)
In the expression: (Data.Serialize.$gdmput)
In an equation for `put': put = (Data.Serialize.$gdmput)
In the instance declaration for `Serialize Foo'
如果我取消注释
实例序列化文本
行,则会出现以下更神秘的错误:

No instance for (Data.Serialize.GSerialize (Rep Text))
  arising from a use of `Data.Serialize.$gdmput'
Possible fix:
  add an instance declaration for
  (Data.Serialize.GSerialize (Rep Text))
In the expression: (Data.Serialize.$gdmput)
In an equation for `put': put = (Data.Serialize.$gdmput)
In the instance declaration for `Serialize Text'
我可以手动实现
序列化
实例,但在这种情况下,孤立实例可能会成为一个真正的问题,而且,我认为我对
Data.Text
了解不够,无法快速、正确地对其进行序列化/反序列化


这个问题有标准的解决方案吗?(我也不热衷于使用谷类的Serialize实例,但我遇到了一些与使用二进制软件包有关的版本问题;binary-0.5.1.1似乎不太支持泛型,我希望避免编写样板文件。)

我认为缺少的实例应该被视为一个特性:
数据。Text
谈论文本,它应该与它的表示不同。因此,解决这个问题的标准方法是将
Data.Text
编码为
Data.ByteString
,按照您希望的编码方式(或者更好,一些规范或元数据希望的编码方式),然后序列化
Data.ByteString


最常见的编码函数可以在中找到。

根据Joachim Britner的建议,下面是我最终使用的实例:

instance Serialize Text where
  put txt = put $ encodeUtf8 txt
  get     = fmap decodeUtf8 get

正如所指出的,您可能需要不同的编码/解码功能,但结构应该相同。

为了解决这个问题,我刚刚在Hackage上发表了文章

该实现类似于,但是
谷物文本
也为惰性文本提供了一个实例

使用
cabal Install text
安装库,并使用以下方法导入实例:

import Data.Serialize.Text()

请注意,对于某些应用程序,它是不可用的,因为它依赖于模板Haskell,而该模板并非在所有平台上都可用。

谢谢!我用encodeUtf8&decodeUtf8编写了一个实例;这似乎是可行的,尽管我遇到了包含文本的更复杂类型的问题。我认为这些问题是由于我对连载的误解造成的。当我解决了所有问题后,为了完整起见,我会在这里发布我正在使用的实例。看起来不错。这就是SafeCopy库所采用的方法,它确实为文本提供了一个实例。最初我被你的问题弄糊涂了,因为我已经在序列化文本了,但我正在使用SafeCopy。