4

Perl と Python の両方で使用できる高速な (xml では遅すぎる) シリアル化方法を探しています。

残念ながら、JSON (およびその他の多く) を使用することはできません。これは、dict キーの型が常に整数から文字列に変更されるためです。キーの型を保持するシリアライゼーション/デシリアライゼーションが必要です。

パイソン:

>>> 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

どんな提案でも大歓迎です。

4

3 に答える 3

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 では整数キーは文字列に変換されます => Perl ハッシュ キーの有効な値

于 2013-08-22T12:29:42.827 に答える
2

ム。あなたは間違った前提から始めました。

Perl には、数値と文字列を区別する意味のある型システムがありません。任意の値をbothにすることができます。指定された値が数値のみと見なされるかどうかは、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 のデータ構造に完全に対応しているため、シリアライゼーションがおそらく存在しない情報を推測する可能性があるという妄想から身を守るために、JSON (または JSON のスーパーセットである YAML) に固執することをお勧めします。

これから何を学びますか?

  • 相互運用性が重要な場合は、Python でクリエイティブなディクショナリ タイプを使用しないでください。

  • 本当に重要な場合は、シリアライゼーションでいつでも型情報をエンコードできます (ヒント: おそらくそうではありません)。{"type":"interger dict", "data":{"1":"foo","2":"bar"}}

  • また、XML が遅すぎると片付けるのも時期尚早です。メソッドには同意しませんが、この最近の記事を参照してください。また、JS に制限されています (展望については先週のHN スレッド)。

    ネイティブの場合、おそらく十分に高速であるため、純粋な Perl または純粋な Python の実装を使用しないことは明らかです。これは、JSON パーサー、YAML パーサー、およびその他のパーサーにも当てはまります。

于 2013-08-22T19:22:08.277 に答える
1

msgpackを試してください。コンパクトで高速です。perlの実装がありますが、使用したことはありません。ただし、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'}
>>> 
于 2013-08-22T15:53:00.837 に答える