4

Perl的数据序列化模块太多了,不知道选哪一个。

我需要将以下数据序列化为字符串,以便将其放入数据库中:

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

我怎么能把它变成文本,然后当我需要它时,又变成一个数组引用数组?

4

3 回答 3

4

我投票支持 JSON(或Data::Serializer在另一个答案中提到,连同JSON)。

JSON模块非常快速高效(如果您从 cpan 安装 JSON::XS,它将为您编译 C 版本,并use JSON自动使用它)。

它适用于 Perl 数据结构,是标准化的,并且 Javascript 语法与 Perl 语法非常相似。您可以使用JSON模块设置一些选项以提高人类可读性(换行符等)

我也用过Storable。我不喜欢它——界面很奇怪,输出也很荒谬,而且它是一种专有格式。Data::Dumper速度快且可读性强,但实际上是单向的(eval有点骇人听闻),再说一遍,它只是 Perl。我也推出了自己的。最后,我得出结论 JSON 是最好的,它快速、灵活且健壮。

于 2012-06-19T00:57:36.203 回答
2

您可以使用Data::Serializer

于 2012-06-18T23:56:50.793 回答
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 很好,很紧凑,但不透明。

于 2012-06-19T00:37:26.453 回答