首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何实现数据对象的自动数据序列化?

如何实现数据对象的自动数据序列化?
EN

Stack Overflow用户
提问于 2010-04-22 19:49:21
回答 3查看 7.2K关注 0票数 16

在具有某种类型的反射/自定义的语言中,一个巨大的好处是可以从各种来源自动构造对象。

例如,在Java中,我可以使用相同的对象来持久化数据库(使用Hibernate)、序列化到XML (使用JAXB)和序列化到JSON (json-lib)。您可以在Ruby和Python中执行相同的操作,通常还需要遵循一些简单的Java属性或注释规则。

因此我不需要太多的“域转移对象”。我可以专注于我正在工作的领域。

在像Haskell和Ocaml这样非常严格的FP中,这似乎是不可能的。尤其是Haskell。我看到的唯一一件事就是做一些预处理或元编程(ocaml)。你必须从下往上做所有的转换,这是不是已经被接受了?

换句话说,要将haskell中的数据类型转换为JSON/XML/DB Row对象,再转换回数据对象,需要做大量乏味的工作。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-22 22:34:12

无论如何,我认为在OCaml中找到的预处理器解决方案(如sexplib、binprot和json-wheel等)是非常好的(我认为人们使用模板Haskell可以做非常类似的事情)。它比反射效率高得多,而且还可以自然地调优到单个类型。如果您不喜欢给定类型foo的自动生成的序列化程序,您可以编写自己的序列化程序,它非常适合包含foo作为组件的类型的自动生成的序列化程序。

唯一的缺点是,您需要学习camlp4才能自己编写其中的一个。但是,一旦您将构建系统设置为使用预处理器,使用它们就非常简单。这就像在类型定义的末尾添加with sexp一样简单:

代码语言:javascript
复制
type t = { foo: int; bar: float }
with sexp

现在,您有了序列化程序。

票数 5
EN

Stack Overflow用户

发布于 2010-04-22 22:53:34

我的理解是,在Haskell中序列化和反序列化的最简单方法是从ReadShow派生。这很简单,并且不能完全满足您的需求。

但是,似乎有HXTText.JSON可以满足您的需求。

票数 4
EN

Stack Overflow用户

发布于 2010-04-23 01:42:05

通常的方法是使用Data.Binary。这提供了基本的序列化功能。数据类型的二进制实例很容易编写,并且可以很容易地从较小的单元中构建。

如果你想自动生成实例,那么你可以使用模板Haskell。我不知道有什么包可以做到这一点,但如果已经存在一个包,我也不会感到惊讶。

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

https://stackoverflow.com/questions/2690455

复制
相关文章

相似问题

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