的MooseX::Storage使用MooseX::Storage::Format::JSON作用,這是如何在其他格式插入一個很好的例子JSON
數據序列化。我看不到任何XML
序列化的角色,但很容易編寫自己的模塊,並且模塊爲它提供了一個鉤子。
這個小例子,展示瞭如何編寫一個作用和消耗(使用)它的一類。角色是一種類似於類的包,它永遠不會自行實例化,而是被使用它的類吸收。它可以被多個類使用。最後展示瞭如何將新角色掛接到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); # or use custom code
}
sub from_xml {
my ($self, $xml) = @_;
return XML::Dumper->new->xml2pl($xml);
}
no Moose::Role;
1;
對象從XML
施工中應通過完成,和/或作爲類方法。
主要
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";
#$obj->x(0.12); # fails as it should (only Int allowed)
這用於寫入和加載從文件中可以添加打印
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
(或添加這些,用相同的代碼)。
然後你可以使用store
和load
在main
以從中
$pt->store($file);
my $pt_new = Point->load($file);
語法=PackageName
是不是MooseX::Storage::Format::
以外的命名空間前綴寫入$file
和負載的作用看Moose::Manual::Roles和Moose::Cookbook::Roles::命名空間(示例)。
[MooseX :: Storage](http://search.cpan.org/~ether/MooseX-Storage-0.52/lib/MooseX/Storage.pm)通過使用[MooseX :: Storage :: Format :: JSON](http://search.cpan.org/~ether/MooseX-Storage-0.52/lib/MooseX/Storage/Format/JSON.pm)的作用。從我所看到的,它是我們那裏唯一的'MooseX :: Storage :: Format'序列化角色。也許寫你自己的? 'Format :: JSON'的代碼是幾十行(使用一個模塊)。我不知道你需要序列化的是什麼,但是可能[XML :: Dumper](http://search.cpan.org/~mikewong/XML-Dumper-0.81/Dumper.pm)可以提供幫助。它聲稱能夠處理對象。 – zdim
@zdim,Re「*從我所看到的,它是唯一的MooseX :: Storage :: Format序列化角色,我們在那裏*」,MooseX :: Storage :: Format :: JSON,... :: YAML和。 .. ::可存儲所有來與MooseX ::存儲。 – ikegami
@Blaise Pascal,所以編寫MooseX :: Storage :: Format :: XML。 – ikegami