序列化(Serialization)通常用于实现将数据和对象存储到一个文件中。生成的字节数据可以重复使用,来生成已保存对象的副本。
处理时间可以说是序列化的优势之一。假设,解析一个文件并从该文件中生成对象。如果这个文件很大,它将会花费一定的时候来处理。
经序列化的对象允许你在这个文件里重复读取对象,从而加快后续处理。
本文将快速演示如何在Perl中序列化和反序列化哈希(hash)、数组(array)、标量(scalaer)和对象(object)。
Perl可以通过Storable模块实现序列化。

哈希(hash)、数组(array)、标量(scalaer)可以通过下面的方式进行序列化:

#!/usr/bin/perl

##############################################
# (c) 2011 LoRui(i@lorui.com, www.lorui.com) #
##############################################

use strict;
use warnings;

use Storable;

#定义一个Hash,用于测试序列化
my %student = (
'No' => '00342001010103037',
'Name' => 'LoRui'
);

store \%student, 'student.lorui'; #序列化,将其保存

print "==== student ====\n";
&dumper(\%student); #输出定义的Hash

my %person = %{retrieve 'student.lorui'}; #读取并反序列化,并将取赋给一个变量

print "\n==== person ====\n";
&dumper(\%person); #输出反序列化Hash


sub dumper {
my $hash_ref = shift;
while(my($key, $val) = each(%$hash_ref)) {
print "$key => $val\n";
}
}


输出结果:

==== student ====
No => 00342001010103037
Name => LoRui

==== person ====
No => 00342001010103037
Name => LoRui


序列化一个对象(object),可参考以下方法:
#!/usr/bin/perl

##############################################
# (c) 2011 LoRui(i@lorui.com, www.lorui.com) #
##############################################

use strict;
use warnings;
use Storable;

package LoRui;

sub new {
my $class = shift;
my $this = {};
bless $this, $class;
return $this;
}

sub set_value {
my ($this, $key, $val) = @_;
$this->{$key} = $val;
}

sub get_value {
my ($this, $key) = @_;
return $this->{$key} || 'Undefined';
}

sub show {
my $this = shift;
while(my ($key, $val) = each(%$this)) {
print "$key => $val\n";
}
}

package main;
my $data_file = 'serialized_obj.lorui';

my $obj = LoRui->new;
$obj->set_value('from', 'LoRui.com');

store $obj, $data_file;

print "### OBJ ###\n";
$obj->show;
print $obj->get_value('to'), "\n";

my $obj_r = retrieve $data_file;
print "\n### OBJ_R ###\n";
$obj_r->show;
print $obj->get_value('to'), "\n";


输出结果:
### OBJ ###
from => LoRui.com
Undefined

### OBJ_R ###
from => LoRui.com
Undefined

上一篇 下一篇