amf3_spec amf3_spec
### AMF3 Specification详解 #### 一、简介 ##### 1.1 目的 Action Message Format (AMF) 是一种紧凑的二进制格式,用于序列化 ActionScript 对象图。一旦序列化,AMF 编码的对象图可用于跨会话持久存储和检索应用程序的公共状态,或者允许两个端点通过交换强类型数据进行通信。 AMF 最初在 Flash Player 6(2001 年)中引入,并在 Flash Player 7 引入 ActionScript 2.0 以及 Flash Player 8 发布时保持不变。这一版本的 AMF 被称为 AMF0。随着 Flash Player 9 和 ActionScript 3.0 的引入,AMF 也进行了更新,以适应新的数据类型和语言特性。此外,新版本还对编码格式进行了优化,以去除序列化数据中的冗余信息。本规范定义了更新后的 AMF 版本,即 AMF3。 ##### 1.2 符号约定 - **1.2.1 扩展 BNF** - 使用扩展巴科斯范式 (Extended Backus-Naur Form, EBNF) 来表示语法结构。 - **1.3 基本规则** - **1.3.1 变长无符号 29 位整数编码** - AMF3 使用一种特殊的变长编码方式来表示整数,该编码方式使用 29 位来表示一个整数,而不是标准的 32 位或 64 位整数。这种编码方式减少了序列化数据的整体大小。 - **1.3.2 字符串和 UTF-8** - 字符串使用 UTF-8 编码。UTF-8 是一种可变长度字符编码,用于 Unicode 字符集。它能够有效地处理不同语言的字符,且对于英文字符占用较少的存储空间。 #### 二、技术概览 ##### 2.1 改进总结 AMF3 相对于 AMF0 在以下几个方面进行了改进: - **更小的数据量**:通过对数据类型的优化和冗余信息的移除,使得序列化的数据量更小。 - **更快的序列化/反序列化速度**:优化后的编码格式使得序列化和反序列化的速度更快。 - **更好的内存利用率**:AMF3 更有效地利用内存资源,尤其是在处理大型数据集时更为显著。 #### 三、AMF3 数据类型 ##### 3.1 概览 AMF3 支持多种数据类型,包括但不限于: - undefinedType - nullType - falseType - trueType - integerType - doubleType - StringType - XMLDocumentType - DateType - ArrayType - ObjectType - XMLType - ByteArrayType ##### 3.2 undefinedType 代表未定义值。在序列化过程中,如果某个变量没有被初始化,则可以使用此类型表示。 ##### 3.3 nullType 表示空值,常用于表示对象或数组中不存在的元素。 ##### 3.4 falseType 布尔类型,表示逻辑“假”。 ##### 3.5 trueType 布尔类型,表示逻辑“真”。 ##### 3.6 integerType 整型数据,使用变长无符号 29 位整数编码方式表示。 ##### 3.7 doubleType 双精度浮点型数据,使用 IEEE 754 标准的 64 位双精度格式表示。 ##### 3.8 StringType 字符串类型,使用 UTF-8 编码表示。 ##### 3.9 XMLDocumentType XML 文档类型,表示 XML 文档。 ##### 3.10 DateType 日期类型,包含时间戳和时区偏移量。 ##### 3.11 ArrayType 数组类型,表示有序的数据集合。 ##### 3.12 ObjectType 对象类型,表示键值对的集合。 ##### 3.13 XMLType XML 类型,表示 XML 字符串。 ##### 3.14 ByteArrayType 字节数组类型,表示一系列原始字节数据。 #### 四、AMF3 的应用场景 ##### 4.1 NetConnection 和 AMF3 NetConnection 类提供了客户端与服务器之间的通信功能。在 ActionScript 3.0 中,可以通过 NetConnection 实例发送和接收 AMF3 编码的数据。 - **4.1.1 NetConnection 在 ActionScript 3.0 中的应用** - 使用 NetConnection 类实例建立连接。 - 通过 NetConnection 实例的 `call` 方法发送 AMF3 编码的数据到服务器。 - 服务器端接收到 AMF3 数据后进行解码,并处理相应的逻辑。 - 服务器将响应结果重新编码为 AMF3 数据并发送回客户端。 - 客户端接收 AMF3 数据并解码。 ##### 4.2 ByteArray, IDataInput 和 IDataOutput AMF3 可以直接在 ByteArray 对象中进行序列化和反序列化操作。通过实现 IDataInput 和 IDataOutput 接口,可以自定义序列化和反序列化的逻辑,从而更好地控制数据的读写过程。 #### 五、规范性参考 - **AMF0 规范**:作为 AMF3 的前身,AMF0 提供了序列化的基本框架和概念。 - **ActionScript 3.0 语言规范**:提供关于 ActionScript 3.0 的完整描述,有助于理解 AMF3 的设计思路。 - **Adobe Flash Player 文档**:详细介绍了 Flash Player 的各个版本及其功能特性,有助于了解 AMF3 在不同版本中的应用情况。 AMF3 是 Flash 平台的一个重要组成部分,通过高效地处理序列化和反序列化任务,为 Flash 应用程序提供了一种快速、轻量级的数据交换机制。随着技术的发展,虽然 Flash 已经逐渐淡出市场,但 AMF3 作为一种高效的序列化协议,在某些领域仍然具有一定的应用价值。




















