有很多模块可以为Perl序列化数据,我不知道选择哪一个。
我需要将以下数据序列化为字符串,以便将其放入数据库中:
my @categories = (
["Education", "Higher Education", "Colleges"],
["Schooling", "Colleges"]
);
我怎么能把它变成文本,然后当我需要它时,转回一个数组引用数组?
答案 0 :(得分:4)
我投票支持JSON(或另一个答案中提到的Data::Serializer
,与JSON
一起投票。)
JSON
模块快速高效(如果从cpan安装JSON :: XS,它将为您编译C版本,use JSON
将自动使用它)。
它适用于Perl数据结构,标准化,并且Javascript语法与Perl语法非常相似。您可以使用JSON
模块设置选项以提高人类可读性(换行等)
我也使用了Storable
。我不喜欢它 - 界面很奇怪,输出是荒谬的,它是一种专有格式。 Data::Dumper
速度快且可读性很强,但实际上是单向的(eval
它有点hackish),而且,它只是Perl。我也推出了自己的产品。最后,我总结说JSON是最好的,快速,灵活且强大。
答案 1 :(得分:2)
您可以使用Data::Serializer
:
答案 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
反序列化的严重不利之处。可存储很好,紧凑但不透明。