5

我一直在寻找非常通用、严格且独立于平台的序列化框架。我发现了一个叫做 ASN.1 的东西。

它看起来像与序列化有关的东西,但我实际上无法理解它是什么。我阅读了 Wikipedia 文章和ITU 文章,但仍然很难知道。

我有很多问题。也许我需要对 ASN.1 进行一些全面的差异描述

  • 什么是 ASN.1?
  • 这是否定义了严格的数据类型?(如 32 位整数、1 位布尔值等)
  • C/C++ 中是否有参考实现?
  • 为什么这看起来不像Apache ThriftProtocol Buffers或其他序列化东西那样流行?
  • 与其他序列化框架相比,ASN.1 的优缺点是什么?
4

3 回答 3

8

什么是 ASN.1?我想维基百科几乎告诉你它是什么。要理解 ASN.1,您必须意识到 ASN.1 将两个关注点分开:描述您的数据和描述您的数据在传输中的样子。

第一部分是描述您的数据。ASN.1 指定了一个抽象语法符号(因此称为 ASN.1)来执行此操作。例如,我可以指定 Coordinate 是一个复数,由必须介于 0 和 100 之间的两个整数组成:

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

下一部分是决定如何将其编码为字节以进行传输。ASN.1 指定了一些标准的编码规则集来执行此操作。不同的编码规则各有优势。大多数是二进制的,但一种是基于文本的(XER 编码为 XML)。编码规则在位级别指定如何表示使用上述抽象描述描述的值。遵循标准的每个人(并同意编码规则)都会得到完全相同的比特串。

PER 编码规则使用抽象定义中的约束来提供更紧凑的编码。例如,如果您知道整数范围为 0..100,则只需 7 位即可对这些值进行编码。

ASN.1 没有定义 32 位整数或 1 位布尔值。实际上,那是以错误的方式考虑 ASN.1,因为那是在考虑值的字节表示。同样,ASN.1 将您的值的描述(我有一个介于 0 和 100 之间的整数)与您的值的表示(我可以用 7 位表示该值)分开。

我不知道参考实现;我不确定谈论一个是否有意义。我的公司销售一种从抽象语法定义生成 C/C++/Java/C# 数据结构和代码的工具。有一些类似的免费工具;我不知道他们的质量。

ASN.1 与序列化框架相比如何?ASN.1 不是序列化框架。也就是说,它没有说明如何获取任何类型的编程数据结构或对象并对其进行编码。它提供了一种抽象描述数据值的方法,并指定了导出这些值的编码的规则。ASN.1 的一个常见用法是使用代码生成器从抽象描述中生成编程数据结构,以及遵循所选编码规则的编码/解码方法。当然,也可以完全手动完成。

ASN.1 的优势?使用工具生成代码的能力。除此之外,还可以灵活地从相同的抽象语法生成不同的编码(例如 XML、PER)。

ASN.1 的缺点?可能很复杂,尽管我怀疑一个人可以使用工具完成很多工作,而不必消化所有复杂性(例如,您可能依赖工具来做正确的事情而不是尝试消化编码规则规范。 )。

更新:现在有第二组基于文本的编码规则。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 回答
0

http://vii.path.berkeley.edu/1609_wave/feb13/Presentations/ASN.1%20Tutorial%20San%20Diego.pptx上的幻灯片 可能会解决您的一些问题。

于 2013-08-10T22:23:48.763 回答