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

Dav*_*d B 2 perl serialization yaml moose

我试图用一些(Moose)对象序列化YAML- 只需使用YAML Dump()Load().加载序列化对象后,在我添加use带有原始模块名称的语句之后,它才"正常工作" .如果我不使用use我不会得到任何错误,直到我尝试调用一些对象方法,然后它会呱呱叫它找不到这个方法.

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

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

Mic*_*man 6

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

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

  • @David B:你混淆了几件不同的事情.导入符号或子元素时需要使用`use`语句.对于OO,唯一的要求是在某处加载模块(类).如果不是方法解析会失败.它是一个类方法(如`new`)还是一个对象方法并不重要. (2认同)