规范 DDS-XTypes 中描述了 CDR 的几种序列化方式,这些序列化包括了:
PLAIN_CDR:规范位于 COBRA/Interoperability 文件中。
PL_CDR:允许可选数据成员。
PLAIN_CDR 亦即 CDR,剩余几种序列化类型被称为 XCDR(Extend CDR)。
PLAIN_CDR
PLAIN_CDR 简称 CDR(Common Data Representation) 的。CDR 特点如下:
每个 CDR encapsulation 中都包含了消息的字节序信息。
原生类型经过对齐。OMG IDL 中定义的原生类型被对齐到 GIOP 消息中的自然边界上。
原生类型
CDR 中的所有原生类型都必须对齐到它们的自然边界上(即变量在 字节流 中的 index 必须能够被其类型大小整除)。为了满足对齐要求,允许变量之间出现 gap,gap 的值是任意的,但是 gap 必须是满足对齐要求的最小尺寸。下面代表了 CDR/OMG-IDL 原生类型的对齐边界:
类型 | 对齐边界 |
---|---|
char | 1 |
wchar | 1 |
octet | 1 |
short | 2 |
unsigned short | 2 |
long | 4 |
unsigned long | 4 |
long long | 8 |
unsigned long long | 8 |
float | 4 |
double | 8 |
long double | 8 |
boolean | 1 |
enum | 4 |
wchar 在 GIOP 1.2 之后对齐边界固定为 1。 |
字节流中的第一个字节索引为 0,因而任意类型都能被放在此处。
浮点数
字符类型
IDL char 类型被表示为单个字节。对于 utf-8 这种多字节编码方式,它的一个字符类型需要使用一个 char array 进行储存。
聚合类型
对齐要求
聚合类型本身没有对齐要求,但是其中包含的原生类型依然有对齐要求。聚合类型不会导致重置 buffer。
struct
结构体安装成员变量声明的顺序进行序列化,每个成员变量都需要遵循对齐要求。
union
union 是一个 tagged union。tag 按照其本身的类型进行序列化,数据成员安装被选择的成员进行序列化。
array
由于 array 的长度是固定的,因此无须添加 array 长度。数组元素按照他们在数组中的顺序进行序列化。多维数组是有序的,因此第一个维度变化最慢,最后一个维度变化最快。
sequence
sequence 首先序列化一个 u32 类型的长度,之后跟随 sequence 的元素。
enum
枚举被序列化为一个 u32 类型的值。在没有显式指定的情况下,枚举的值取决于枚举在定义中出现的顺序,第一个枚举值为 0,此后按顺序递增。
string 和 wstring
无论是 string 还是 wstring。序列化时首先写入一个 u32 的长度,之后写入等同于此长度的字节流。字节流中包含了 '\0'
字符,因此长度为零的字符串字节流长度为 1。
encapsulation
在完成序列化后,需要在序列化的首部添加一个 enc。enc 包括两个字节。第一个字节确定了字节流的字节序,第二个字节确定了
两个字节含意如下: