1.3 组合类型
AMQP定义了组合类型,组合类型被用来封装格式化数据比如帧主体。组合类型定义了一个描述值,这个描述值是由已知的固定字段组成的。每个组合类型的定义包括了一个固定字段的有序序列,每个序列中包含名称、类型和多样性。组合类型的定义包含了一个或者多个描述符(语法的和数字的)来确定对他们的描述。
规格文档中,组合类型通常被定义在XML文档中。如下边的注释就是用来描述组合类型的:
<type class="composite" name="book" label="example composite type">
<doc>
<p>An example composite type.</p>
</doc>
<descriptor name="example:book:list" code="0x00000003:0x00000002"/>
<field name="title" type="string" mandatory="true" label="title of the book"/>
<field name="authors" type="string" multiple="true"/>
<field name="isbn" type="string" label="the ISBN code for the book"/>
</type>
Figure 1.4: 组合类型实例
如果在描述的字段中出现了空值的情况下,那么属性中的强制属性才会生效。
如果在描述中出现了多个值的情况下,那么属性中的多样性属性才会生效。描述的类型中单个字段总是被允许的。多个字段的值总是使用在数组类型中的,数组类型中的元素通常是被定义成固定字段的。需要注意的是,一个空的值和一个长度为0的数组值在语法上是有效的。
被描述成多样性或者强制性的字段至少保证要有一个值,也就是说在这种情况下,出现了空值和数组长度为0的都是不合法的。
1.3.1 列表封装
AMQP的组合类型的值是被封装成列表格式的。列表中每个元素都是与列在组合类型中的字段相关联的。被允许封装的元素是由类型和对应字段相关联的多样性来决定的。当列表中末尾的元素为空的时候,这时是可以忽略的。列表的描述符可以指出组合类型是被怎么描述的。
下边是根据上边书这个组合类型描述的例子。例子中,最后一个ISBN是空值,根据规则它对应的值是可以被忽略的。
constructor list representation of a book
| |
+--------------------------+-------------------------+ +---------------------+-----------------+
| | | |
0x00 0xA3 0x11 "example:book:list" 0xC0 0x40 0x03 title authors isbn
| | | | |
| identifies composite type | | |
| | | 0x40
sym8 +------------------------+ | |
(symbol) | | null value
+-----------------------+-----------------------+ |
| | |
0xA1 0x15 "AMQP for & by Dummies" |
|
+------------------------------------------------------------+-----+
| |
0xE0 0x25 0x02 0xA1 0x0E "Rob J. Godfrey" 0x13 "Rafael H. Schloming"
| | | | | | |
size | | +-------------+-----------+ +---------------+----------------+
| | | |
count | first element second element
|
element constructor
Figure 1.5: 组合类型值实例