Fast Perl< - > Python序列化,支持整数字典键

时间:2013-08-22 12:23:29

标签: python perl serialization dictionary

我正在寻找可以在Perl和Python中使用的快速(xml太慢)序列化方法。

不幸的是,我不能使用JSON(和许多其他人),因为它总是将dict键的类型从整数更改为字符串。我需要序列化/反序列化来保留密钥类型。

的Python:

>>> import json
>>> dict_before = {1:'one', 20: 'twenty'}
>>> data = json.dumps(dict_before)
>>> dict_after = json.loads(data)

>>> dict_before
{1: 'one', 20: 'twenty'}            #integer keys
>>> dict_after
{u'1': u'one', u'20': u'twenty'}    #string keys

欢迎任何建议。

3 个答案:

答案 0 :(得分:4)

你可以使用yaml。

>>> import yaml
>>> dict_before = {1:'one', 20: 'twenty'}
>>> data = yaml.safe_dump(dict_before)
>>> dict_after = yaml.safe_load(data)
>>> dict_after
{1: 'one', 20: 'twenty'}

我有类似的问题。我想在Perl和Python中共享一个配置文件,我不得不使用yaml。

您可以使用以下命令在python中安装yaml模块:

pip install PyYAML

虽然,整数键将在perl =>中转换为字符串。 Legal values for Perl hash key

答案 1 :(得分:2)

亩。你已经开始使用错误的前提。

Perl没有一个有意义的类型系统来区分数字和字符串。任何给定的值都可以两者。仅使用Perl语言无法确定给定值是否仅被视为数字(尽管您可以使用Devel::Peek之类的模块)。完全不可能知道最初的给定值是什么类型。

my $x = 1;     # an integer (IV), right?
say "x = $x";  # not any more! It's a PVIV now (string and integer)

此外,在哈希映射(“词典”)中,键类型始终被强制转换为字符串。在数组中,键始终强制转换为整数。其他类型只能伪造。

解析文本时这很棒,但当然在序列化数据结构时会引入无穷无尽的痛苦。 JSON完全映射到Perl数据结构,因此我建议您坚持使用(或YAML,因为它是JSON的超集)来保护自己免受序列化可能推断出不可能存在的信息的错觉。

我们从中得到了什么?

  • 如果互操作很重要,请不要在Python中使用创意字典类型。

  • 如果序列化真的很重要,你总是可以对序列化中的类型信息进行编码(提示:它可能不是):{"type":"interger dict", "data":{"1":"foo","2":"bar"}}

  • 将XML视为太慢也是为时过早。请参阅this recent article,虽然我不同意这些方法,但它将自己局限于JS(上周的HN thread视角)。

    如果它是原生的,它可能足够快,所以显然不要使用任何纯Perl或纯Python实现。这也适用于JSON-和YAML-以及其他 - 分析者。

答案 2 :(得分:1)

试试msgpack。它紧凑而快速。有一个perl implementation但我从未使用它。 python impl虽然有效:

>>> import msgpack
>>> x=msgpack.dumps({1:'aaa',2:'bbb'})
>>> x
'\x82\x01\xa3aaa\x02\xa3bbb'
>>> len(x)
11
>>> print msgpack.loads(x)
{1: 'aaa', 2: 'bbb'}
>>>