Perl数据序列化和持久化(入门):Storable模块

 Perl提供了一个Storable模块,用来对数据结构进行序列化(serialization,Perl中称为冻结),也就是将数据结构保存为二进制数据。

  • 序列化后的数据可以写入文件实现持久化,可以将持久化文件拷贝给远程机器
  • 也可以通过网络套接字将序列化数据传递给远程机器
  • 序列化后的数据在任意机器上都可以反序列化(deserialization,Perl中称为解冻)得到原始的数据结构
  • 序列化数据结构时是进行深拷贝的,序列化完成后,修改原始数据,不会影响反序列化的结果

序列化:freeze、nfreeze和thaw

Storabel的freeze和thaw函数分别用来冻结(序列化)和解冻(反序列化):

  • freeze冻结的是数据对象,不包括它们的引用和名称
  • freeze的参数需要是引用,可以是多个引用参数,返回的是二进制的冻结序列,各数据结构序列化在不同行
  • thaw的参数是引用变量,返回的是一个匿名列表,列表各元素对应freeze冻结时的各数据结构
  • nfreeze也是冻结,但是按照网络字节序进行序列化,适合远程传输序列化时的标量名称,见下一小节对主机字节序和网络字节序的描述
#!/usr/bin/perl use 5.010; use Storable qw(freeze thaw);  %hash=(         'longshuai'=>{                       'gender'=>'male',                       'age'   =>18,                       'prov'  =>'jiangxi',                      },         'wugui'=>{                   'gender'=>'male',                   'age'   =>20,                   'prov'  =>'zhejiang',                  },         'xiaofang'=>{                      'gender'=>'female',                      'age'   =>19,                      'prov'  =>'fujian',                     },       );  @name=('fairy',[qw(longshuai wugui xiaofang)]);  $frozen = freeze [\%hash,\@name];   # 冻结引用,返回一个冻结后的列表 #say $frozen;              # 输出一堆乱码  $thaw_out=thaw($frozen);   # 解冻,返回引用列表  say $thaw_out->[0];                # 输出:HASH(0x557171a4cff8) say $thaw_out->[0]{wugui}{prov};   # 输出:zhejiang say $thaw_out->[1];                # 输出:ARRAY(0x557171a4d220) say $thaw_out->[1][1][2];          # 输出:xiaofang

上面的示例中,使用freeze冻结两个数据结构后,冻结后的二进制数据内容将赋值给一个标量变量,注意它返回的是类似于字符串那种形式的,只不过这段字符串是二进制格式的。

使用thaw解冻后,将返回一个匿名列表,列表中的元素是各冻结的数据结构的引用。对于上面的示例来说,返回值类似如此结构[$ref_hash,$ref_name],将其赋值给一个引用变量$thaw_out,然后就可以通过$thaw_out->[0]$thaw_out->[1]分别访问这两个引用。

如下图描述:

freeze序列化过程:

thaw反序列化过程:

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信