分享

Perl实现序列化(Serialize)和反序列化(Unserialize)

 vclyin 2012-04-20

序列化(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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多