规范 DDS-XTypes 中描述了 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 原生类型的对齐边界:

Table 1. 对齐边界
类型对齐边界

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 包括两个字节。第一个字节确定了字节流的字节序,第二个字节确定了

两个字节含意如下:

Diagram
Figure 1. encapsulation
Last moify: 2024-01-03 03:13:07
Build time:2025-07-18 09:41:42
Powered By asphinx