我正在寻找可以在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
欢迎任何建议。
答案 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'}
>>>