如何在Perl中序列化一个数组引用的数组?

4

对于Perl的数据序列化,有很多模块可供选择,我不知道该选哪一个。

我有以下需要序列化为字符串以便放入数据库的数据:

my @categories = (
    ["Education", "Higher Education", "Colleges"],
    ["Schooling", "Colleges"]
);

我该如何把它转换成文本,然后在需要的时候再将其转换回数组的数组引用?


我想指出,您可能需要考虑将其编码为JSON格式。这不是必需的,而且可能不太高效,但它具有独立于语言的优点。 - 700 Software
重复的问题 https://dev59.com/gWTVa4cB1Zd3GeqP_hJG - daxim
3个回答

4
我赞成使用JSON(或另一个答案中提到的Data::Serializer,结合JSON)。
JSON模块非常快速高效(如果您从CPAN安装JSON::XS,它将为您编译C版本,并且use JSON将自动使用它)。它可以很好地处理Perl数据结构,是标准化的,而且Javascript语法与Perl语法非常相似。您可以使用JSON模块设置选项来改善人类可读性(换行等)。
我也使用过Storable。我不喜欢它——接口很奇怪,输出也毫无意义,而且它是一种专有格式。Data::Dumper非常快速且相当易于阅读,但实际上是单向的(eval它有点hackish),并且仅适用于Perl。我也自己开发过类似的工具。最终,我得出结论:JSON是最好的选择,它既快速又灵活、健壮。

2

1

你可以自己编写代码,但是需要考虑到一些棘手的问题,例如转义引号和反斜杠或者所选择的分隔符。

下面的程序展示了如何使用标准的Perl模块Data::Dumper和Storable来序列化和反序列化数据,以适合存储在数据库中。

#! /usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;
use Storable qw/ nfreeze thaw /;

use Test::More tests => 2;

my @categories = (
    ["Education", "Higher Education", "Colleges"],
    ["Schooling", "Colleges"]
);

{
  local $Data::Dumper::Indent = 0;
  local $Data::Dumper::Terse = 1;
  my $serialized = Dumper \@categories;
  print $serialized, "\n";
  my $restored = eval($serialized) || die "deserialization failed: $@";
  is_deeply $restored, \@categories;
}

{
  my $serialized = unpack "H*", nfreeze \@categories;
  print $serialized, "\n";
  my $restored = thaw pack "H*", $serialized;
  die "deserialization failed: $@" unless defined $restored;
  is_deeply $restored, \@categories;
}

Data::Dumper有一个好处,就是易于人类阅读,但严重的缺点是需要使用eval进行反序列化。Storable则是紧凑而不透明的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接