为什么我必须加载一个Perl类来使用它的对象我从YAML反序列化?

时间:2010-10-27 12:22:00

标签: perl serialization yaml moose

我试图使用YAML序列化一些(Moose)对象 - 只需使用YAML的Dump()Load()。加载序列化对象后,在我添加带有原始模块名称的use语句之前,它不起作用。如果我不使用use,在尝试调用某个对象方法之前我不会收到任何错误,那么它会说它无法找到这个方法。

我认为加载所需的类是反序列化器工作的一部分,如果我没有弄错Storable确实是自己做的。那么YAML有什么破坏了吗?

另外,我注意到模块的版本没有与序列化对象一起存储。有什么方法可以添加吗?

2 个答案:

答案 0 :(得分:6)

序列化用于数据,而不是行为。 Perl中的对象只是一个有福的参考。 YAML和Storable序列化并存储数据(包括祝福),但这只是类的名称,而不是类本身。在反序列化对象时,您负责加载类(以及任何父类)。

在一般情况下,序列化程序无法加载该类。虽然约定是包(类)==文件名,但它不是必需的。模块可以定义它想要的任何包名称,也可以定义多个包。例如,我可能会编写一个名为AbstractSyntaxTree.pm的模块来定义类NodeBranchLeaf

答案 1 :(得分:2)

  

另外,我注意到了该版本   模块没有存储   序列化对象。有什么方法可以添加吗?

不,对象只知道他们被祝福的包裹。您可以使用use Module VERSION语法在两种环境中都需要某个版本的模块。