我应该使用YAML还是JSON来存储我的Perl数据?
在过去6个月左右,我一直使用YAML格式取得合理成功。
然而,YAMLparsing器的纯粹的Perl实现是相当烦琐的手写一个可读的文件,并有(在我看来)恼人的怪癖,如在文件的末尾需要一个换行符。 与我的其他程序相比,速度也非常慢。
我正在思考我的项目的下一个发展,我正在考虑使用JSON(YAML的一个最严格的子集,事实certificate)。 但是哪种格式在Perl中最具社区吸引力和努力?
这对于Perl,YAML或JSON中的简单数据描述来说,今天看来是更好的长期格式,为什么呢?
YAML和JSON在Perl中是非常不稳定的,我承认我倾向于在这个过程中。 我会build议要么让你获得尽可能多的社区支持。 我会根据各种格式的利弊做出决定。 我打破了像这样的各种数据序列化选项(我要去社区维基,这样人们可以添加到它):
YAML赞成
- 人类友好,人们甚至不知道它写基本的YAML
- 所见即所得的string
- performance力(它具有TMTOWDI本质)
- 可扩展的types/元数据系统
- Perl兼容的数据types
- 手提
- 熟悉(很多内联和string语法看起来像Perl代码)
- 好的实现,如果你有一个编译器(YAML :: XS)
- 很好的转储Perl数据的能力
- 紧凑地使用屏幕空间(可能,您可以格式化为一行)
YAML缺点
- 大规格
- 不可靠/不完整的纯Perl实现
- 空格作为语法可能是有争议的。
JSON优点
- 人类可读/可写
- 小规格
- 好的实现
- 手提
- Perlish语法
- YAML 1.2是JSON的超集
- 紧凑地使用屏幕空间
- Perl友好的数据types
- 很多事情处理JSON
JSON缺点
- string不是所见即所得
- 没有可扩展性
- 一些Perl结构必须被特别表示(对象和球体)
- 缺乏可expression性
XML优点
- 广泛使用
- Web开发人员熟悉的语法
- 很好的XML模块的大型语料库
- 架构
- search和转换数据的技术
- 手提
XML缺点
- 人类阅读和写作的乏味
- Perl的外部数据结构
- 缺乏可expression性
- 大规格
- 详细
Perl / Data :: Dumper Pros
- 没有依赖关系
- 令人惊讶的紧凑(与正确的标志)
- Perl友好
- 可以转储任何东西(通过DDS )
- performance的
- 紧凑地使用屏幕空间
- 所见即所得的string
- 熟
Perl / Data :: Dumper Cons
- 非便携式(对其他语言)
- 不安全(没有英雄的措施)
- 不懂Perl的程序员
可储存的优点
- 紧凑? (没有数字来备份)
- 快速? (没有数字来备份)
可存储的缺点
- 人类敌对
- 跨可存储版本不兼容
- 非便携式(对其他语言)
与大多数事情一样, 这取决于 。 我想如果你想要速度和互操作性(与其他语言),使用JSON,特别是JSON :: XS 。
如果你想要一些Perl模块将要使用的东西,可以使用YAML。 在CPAN上查找支持YAML的数据描述或者依赖于YAML的数据描述比JSON更常见。
请注意,我不是一个权威,这个意见主要是基于预感和猜想。 特别是,我没有分析JSON :: XS与YAML :: XS 。 如果我在进攻方面无知,我只能希望我能够让一个人感到愤慨,通过纠正我来为讨论提供有用的信息。
这是关于人的可读性,如果这是你主要关心的selectYAML:
YAML:
american: - Boston Red Sox - Detroit Tigers - New York Yankees national: - New York Mets - Chicago Cubs - Atlanta Braves
JSON:
{ "american": [ "Boston Red Sox", "Detroit Tigers", "New York Yankees" ], "national": [ "New York Mets", "Chicago Cubs", "Atlanta Braves" ] }
纯Perl的YAML实现(与YAML::Syck
相对的YAML
模块)似乎有一些严重的问题。 最近我遇到了一些问题,无法处理YAML文件的行数很长(32K字符左右)。
YAML能够存储和加载有福的variables,默认情况下是这样(下面的代码片段是从Emacs的*sepia-repl*
缓冲区中复制的):
I need user feedback! Please send questions or comments to seano@cpan.org. Sepia version 0.98. Type ",h" for help, or ",q" to quit. main @> use YAML undef main @> $foo = bless {}, 'asdf' bless( {}, 'asdf' ) main @> $foo_dump = YAML::Dump $foo '--- !!perl/hash:asdf {} ' main @> YAML::Load $foo_dump bless( {}, 'asdf' )
这是非常可怕的安全方式,因为不可信的数据可以用来调用应用程序中定义的任何DESTROY
方法 – 或者它使用的任何模块。
以下简短的程序演示了这个问题:
#!/usr/bin/perl use YAML; use Data::Dumper; package My::Namespace; sub DESTROY { print Data::Dumper::Dumper \@_; } package main; my $var = YAML::Load '--- !!perl/hash:My::Namespace bar: 2 foo: 1 ';
JSON默认不允许这样做 – 可以序列化Perl“对象”,但是为了做到这一点,必须定义TO_JSON方法。
如果您正在考虑JavaScript对象表示法,为什么不使用“Perl对象表示法”?
JSON:
{"name": "bob", "parents": {"mother": "susan", "father": "bill"}, "nums": [1, 2, 3]}
Perl的:
{name => "bob", parents => {mother => "susan", father => "bill"}, nums => [1, 2, 3]}
你也可以考虑使用Storable 。 你可能会得到一个非常好的速度提升。 取舍是:
- 可存储格式是二进制的,不像JSON或YAML那样是人类可读的
- 可存储不是纯粹的Perl模块(如果这很重要)
我使用YAML来跟踪进程的状态,因为我可以在进程中读取YML。 您(技术上)需要完整的文档来读取XML或JS。 YAML很适合跟踪状态,因为您可以将大量的迷你文档写入文件。 否则,我通常使用XML或JS。 好的利弊总结以上,顺便说一句。