为什么我必须加载Perl类才能使用从YAML反序列化的对象?

为什么我必须加载Perl类才能使用从YAML反序列化的对象?,perl,serialization,yaml,moose,Perl,Serialization,Yaml,Moose,我试图用YAML序列化一些(Moose)对象——只需使用YAML的Dump()和Load()。加载序列化对象后,直到我添加了一个带有原始模块名的use语句,它才“起作用”。如果我不使用use,在我尝试调用某个对象方法之前,我不会得到任何错误,那么它会发出咯咯声,说它找不到这个方法 我认为加载所需的类是反序列化程序工作的一部分,如果我没有弄错的话,Storable本身就是这样。那么YAML有什么问题吗 另外,我注意到模块的版本没有与序列化对象一起存储。有没有添加它的方法?序列化是针对数据的,而不是

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

我认为加载所需的类是反序列化程序工作的一部分,如果我没有弄错的话,Storable本身就是这样。那么YAML有什么问题吗


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

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

在一般情况下,序列化程序无法加载该类。虽然约定是包(类)=文件名,但它不是必需的。一个模块可以定义它想要的任何包名,或者多个包。例如,我可以编写一个名为AbstractSyntaxTree.pm的模块,它定义了类
节点
分支
、和

另外,我注意到了 模块未与存储在一起 序列化对象。有什么办法补充吗


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

好吧,我现在找不到它,但最近(这里)有人告诉我,如果我要在对象类上使用类方法(aka
new
),或者它导出任何我想导入的内容,我只需要
使用
对象类(作为一个对象类,它不应该如此)。我想它不准确…@David B:你混淆了两个不同的东西。导入符号或子类需要使用
use
语句。对于OO,唯一的要求是模块(类)被加载到某个地方。如果不是,方法解析将失败。如果是类方法(如
new
),则无所谓或者一个对象方法。是的,但我被告知反序列化程序负责加载其所有序列化对象模块。而且,
Storable
似乎确实这样做了,但
YAML
没有。我阅读了可存储文档后认为,加载类不是一个功能,而是looki的一个副作用ng用于
可存储的\u-thaw
方法。文档中包含了一个关于它可能失败的情况的警告。它也不会尝试处理继承链。最好自己加载类。Michael,感谢您的关注。