我不应该使用Storable或YAML来序列化我的(Moose)对象吗?

时间:2010-10-27 06:01:51

标签: perl serialization moose kiokudb

我有一些Moose对象和一些其他简单的哈希对象(哈希,数组)我想序列化。

起初,我使用了一个简单的

my $obj_store_file = nstore($obj);

my $obj = retrieve($obj_store_file);

这很有效。

稍后,我发现了MooseX::StorageKiokuDB。我尝试使用它们来享受它们带来的好处,但是:

  • MooseX::Storage似乎重新创建多次引用的对象。例如,我的一个序列化对象包含一些属性,每个属性引用另一个对象的同一个实例。在序列化之前,所有这些引用显然是相同的 - 它们都指向同一个对象。使用MooseX::Storage进行序列化/反序列化后,此单个对象将被复制,每个引用都指向该对象的另一个实例。我被告知MooseX::Storage不适合表示对象图,我可能想尝试KiokuDB
  • 我做到了,虽然我觉得KiokuDB对我的需求来说太过分了。我不需要DB可以提供的所有花哨的东西。不幸的是,由于我的一个对象非常庞大并且在使用默认值进行序列化时会占用内存,我似乎必须编写一个自定义序列化程序或单独存储其“数据”部分然后再写一个服装KiokuX::Module ...非常矫枉过正。

所以,我回到了'可存储或YAML'。我的问题很简单:是的,KiokuDB有一些好处(特别是它维护对象图的事实),也许还有MooseX::Storage的好处(虽然我真的找不到后者)。但是,鉴于这些好处并非对我有用, 是否有理由使用可存储或YAML?

换句话说,以这种方式存储(Moose)对象有什么问题吗?是'非法'吗?

1 个答案:

答案 0 :(得分:1)

我的经验是,这取决于你为什么要序列化数据。我喜欢Storable for program state,包括窗口大小/位置等。我更喜欢YAML用于配置数据或您可能想要与应用程序的另一个副本交换的任何内容。 (即在用户之间共享 - 具有不同版本的Perl或Storable的用户可能无法读取可存储文件。)可存储支持对象图(假设冻结/解冻正确完成)。我不确定YAML。