Perl的数据序列化模块太多了,不知道选哪一个。
我需要将以下数据序列化为字符串,以便将其放入数据库中:
my @categories = (
["Education", "Higher Education", "Colleges"],
["Schooling", "Colleges"]
);
我怎么能把它变成文本,然后当我需要它时,又变成一个数组引用数组?
Perl的数据序列化模块太多了,不知道选哪一个。
我需要将以下数据序列化为字符串,以便将其放入数据库中:
my @categories = (
["Education", "Higher Education", "Colleges"],
["Schooling", "Colleges"]
);
我怎么能把它变成文本,然后当我需要它时,又变成一个数组引用数组?
我投票支持 JSON(或Data::Serializer
在另一个答案中提到,连同JSON
)。
该JSON
模块非常快速高效(如果您从 cpan 安装 JSON::XS,它将为您编译 C 版本,并use JSON
自动使用它)。
它适用于 Perl 数据结构,是标准化的,并且 Javascript 语法与 Perl 语法非常相似。您可以使用JSON
模块设置一些选项以提高人类可读性(换行符等)
我也用过Storable
。我不喜欢它——界面很奇怪,输出也很荒谬,而且它是一种专有格式。Data::Dumper
速度快且可读性强,但实际上是单向的(eval
有点骇人听闻),再说一遍,它只是 Perl。我也推出了自己的。最后,我得出结论 JSON 是最好的,它快速、灵活且健壮。
您可以使用Data::Serializer
:
您可以自己滚动,但您必须担心一些棘手的问题,例如转义引号和反斜杠或您选择的分隔符。
下面的程序展示了如何使用标准 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 很好,很紧凑,但不透明。