5

私は非常に一般的で、厳密で、プラットフォームに依存しないシリアライゼーション フレームワークを探していました。そして、ASN.1 と呼ばれるものを発見しました。

連載に関係しているように見えますが、それが何なのかはよくわかりませんでした。ウィキペディアの記事とITU の記事を読みましたが、それでもわかりません。

たくさんの質問があります。たぶん、ASN.1 の全体的な差分の説明が必要です。

  • ASN.1 とは何ですか?
  • これは厳密なデータ型を定義していますか? (32 ビット整数、1 ビットブールなど)
  • C/C++ の参照実装はありますか?
  • これがApache ThriftProtocol Buffers、またはその他のシリアライゼーションのように人気がないように見えるのはなぜですか?
  • 他のシリアル化フレームワークと比較したときの ASN.1 の長所と短所は何ですか?
4

3 に答える 3

8

ASN.1 とは何ですか? ウィキペディアはそれが何であるかをほとんど教えてくれると思います。ASN.1 を理解するためには、ASN.1 が 2 つの関心事を分けていることを理解する必要があります: データを記述することと、送信時にデータがどのように見えるかを記述することです。

最初の部分は、データの説明です。ASN.1 は、これを行うために抽象構文表記法 (したがって、ASN.1 という名前) を指定します。たとえば、Coordinate が 0 から 100 の間でなければならない 2 つの整数のシーケンスで構成される複雑な値であることを指定できます。

    Coordinate ::= SEQUENCE {x INTEGER(0..100), y INTEGER(0..100) }

次の部分は、送信のためにこれをバイトにエンコードする方法を決定することです。ASN.1 では、これを行うためのエンコード規則の標準セットがいくつか指定されています。さまざまなエンコード規則には、それぞれ独自の利点があります。ほとんどはバイナリですが、1 つはテキストベースです (XER は XML にエンコードされます)。エンコーディング ルールは、上記の抽象的な記述を使用して記述された値を表現する方法をビット レベルで指定します。標準に従っている (そしてエンコーディング規則に同意している) 全員が、まったく同じビット列を取得します。

PER エンコーディング ルールは、抽象定義の制約を使用して、よりコンパクトなエンコーディングを提供します。たとえば、整数の範囲が 0..100 であることがわかっている場合、これらの値をエンコードするのに 7 ビットしか必要ありません。

ASN.1 は、32 ビットの整数または 1 ビットのブール値を定義していません。実際、それは値のバイト表現について考えているため、間違った方法で ASN.1 について考えています。繰り返しになりますが、ASN.1 は、値の説明 (0 から 100 までの整数を使用できます) と値の表現 (その値を 7 ビットで表現できます) を分離します。

参照実装については知りません。1つについて話すことが意味があるかどうかはわかりません。私の会社は、抽象構文定義から C/C++/Java/C# データ構造とコードを生成するツールを販売しています。同様の無料ツールがいくつかあります。私は彼らの品質を知りません。

ASN.1 はシリアル化フレームワークと比べてどうですか? ASN.1 はシリアル化フレームワークではありません。つまり、あらゆる種類のプログラミング データ構造またはオブジェクトを取得してエンコードする方法については何も述べていません。データ値を抽象的に記述する方法を提供し、それらの値のエンコーディングを導出するルールを指定します。一般的な ASN.1 の使用法は、コード ジェネレーターを使用して、選択したエンコーディング規則に従うエンコーディング/デコーディング メソッドと共に、抽象的な記述からプログラミング データ構造を生成することです。もちろん、これを完全に手動で行うこともできます。

ASN.1の利点? ツールを使用してコードを生成する能力。それに加えて、同じ抽象構文からさまざまなエンコーディング (XML、PER など) を生成できる柔軟性があります。

ASN.1 の欠点? おそらく複雑さですが、人はツールを使用して、すべての複雑さを消化する必要なく、多くのことを成し遂げることができると思います (たとえば、エンコーディング ルールの仕様を消化しようとするのではなく、正しいことを行うためにツールに頼る可能性が高いです。 )。

更新: 2 番目のテキストベースのエンコード規則セットが追加されました。JER は JSON にエンコードされます。

于 2013-08-12T00:55:12.077 に答える
1
  1. これは、ISO によって定義されたシリアル化標準です。

  2. はい、値が占有する最小のスペースは (afaik) 5 ビットですが。

  3. 私はすべてを知っていると主張しているわけではありませんが、完全なものについては知りません。

  4. 中立的な方法で答えるのは難しいですが、主に複雑さを経験した限り、完全な実装に近づくことは困難です.

  5. 4 を参照してください。ASN.1 はかなりスペース効率が良いですが (protobuf は、そのお金で実行できる可能性があります)、他のほとんどのシリアル化方法と比較すると、かなり複雑に見えます。最終的には、複雑さが失われることがよくあります (「読み取り仕様に料金を支払う」こともよくあります)。

于 2013-08-09T23:01:07.877 に答える