MooseX::Storage使用
MooseX::Storage::Format::JSONrole将数据序列化为
JSON
,这是一个很好的示例,可以用来插入其他格式。我没有看到任何与
XML
串行化相关的roles,但编写自己的roles非常容易,并且该模块提供了一个钩子。
这个简单的示例展示了如何编写一个role并在类中使用它。一个 role 是一个类似包的类,它永远不会被单独实例化,而是被其他类吸收。它的目的是提供可以轻松“插入”和多次使用的功能。最后展示了如何将新的 role 钩入 MooseX::Storage
中,以便在您的类中使用它。
它使用XML::Dumper本身进行序列化,大多数情况下,它只是作为自定义代码的占位符(如果需要)。
Point.pm
package Point;
use Moose;
use overload q("") => sub {
my $self = shift;
return '(' . $self->x . ', ' . $self->y . ')'
};
has 'x' => (is => 'rw', isa => 'Int', required => 1, default => 0);
has 'y' => (is => 'rw', isa => 'Int', required => 1, default => 0);
with 'SerializeXML';
sub BUILD { print "Created a Point $_[0]\n" }
__PACKAGE__->meta->make_immutable;
1;
这里唯一明确的声明是这行代码:
with 'SerializeXML';
SerializeXML.pm
package SerializeXML;
use Moose::Role;
use XML::Dumper;
sub to_xml {
my ($self) = shift;
return XML::Dumper->new->pl2xml($self);
}
sub from_xml {
my ($self, $xml) = @_;
return XML::Dumper->new->xml2pl($xml);
}
no Moose::Role;
1;
从
XML
构建对象应通过
new
或类方法完成。
主要的
use warnings;
use strict;
use Point;
my $pt = Point->new(x => 10, y => 12);
my $obj_xml = $pt->to_xml;
print "$obj_xml\n";
my $obj = $pt->from_xml($obj_xml);
print "Object via role: $obj\n";
这会打印输出
Created a Point (10, 12)
<perldata>
<hashref blessed_package="Point" memory_address="0x1691438">
<item key="x">10</item>
<item key="y">12</item>
</hashref>
</perldata>
Object via role: (10, 12)
可以添加写入和从文件加载的方法。但现在您有一个准备好的角色,可以连接到
MooseX::Storage
中,如下所示。
我不知道也没有测试
XML::Dumper
在
Moose
中的表现如何。请进行测试,如果不能满足您的需求,则将其调用更换为自己编写的代码。
如果需要,剩下的步骤是将其集成到
MooseX::Storage
中。
在上述代码中,有两个必要的小变化。在
Point
中使用角色。
use MooseX::Storage;
with Storage(format => '=SerializeXML', io => 'File');
将to_xml
和from_xml
重命名为freeze
和thaw
(或添加相同代码的新函数)。
然后,您可以在main
中使用store
和load
来写入$file
并从其中加载。
$pt->store($file);
my $pt_new = Point->load($file);
=PackageName
语法是用于除MooseX::Storage::Format::
以外的命名空间前缀。
关于角色,请参见Moose::Manual::Roles和Moose::Cookbook::Roles::命名空间(示例)。
MooseX::Storage::Format
序列化角色。也许你可以自己编写一个?Format::JSON
的代码只有几十行(使用一个模块)。我不知道你需要序列化什么,但也许 XML::Dumper 可以帮助你。它声称能够处理对象。 - zdimMooseX::Storage::Format
下的其他模块。 - zdim