继上篇《SOME/IP有那么难吗?》与大家分享了SOME/IP及SD的概念后,今天我们将分享的内容是SOME/IP序列化的那些事。
何为序列化
序列化(Serialization):将数据结构或对象依据事先定义的规则转换成二进制串的过程。
反序列化(Deserialization):将二进制串依据相同规则重新构建成数据结构或对象的过程。
举个栗子
张三在网上报名参加北电艺考,要求填写的报名信息有: 性别、年龄、身高、体重、身份证号。张三在本地电脑填写完成后,这些信息通过序列化操作转换成二进制数据串,数据串通过网络传输到报名系统服务器,报名系统通过反序列化操作将二进制数据串还原成对象信息。

SOME/IP的序列化过程
序列化在AUTOSAR中是指数据在协议数据单元(PDU)中的表达形式,可以理解为来自应用层的真实数据转换成固定格式的字节序,以实现数据在网络上的传输。软件模块(SWC)将数据(前一篇文章中提到的服务接口的数据内容)从应用层传递到RTE层,在RTE层调用SOME/IP Transformer,执行可配置的数据序列化(Serialize)或反序列化(Deserialize)。SOME/IP Serializer将结构体形式的数据序列化为线性结构的数据;SOME/IP Deserializer将线性结构数据再反序列化为结构体形式数据。在服务端,数据经过SOME/IP Serializer序列化后,被传输到服务层的COM模块;在客户端,数据从COM模块传递到SOME/IP Deserializer反序列化后再进入RTE层。

那么SOME/IP如何实现序列化呢?(以下所有序列化过程暂不考虑对齐Alignment, 待后续分享)
基本数据类型的序列化
SOME/IP目前支持的基本数据类型有这么多:
类型 |
描述 |
大小(bit) |
boolean |
TRUE/FALSE |
8 |
uint8 |
unsigned integer |
8 |
uint16 |
unsigned integer |
16 |
uint32 |
unsigned integer |
32 |
uint64 |
unsigned integer |
64 |
sint8 |
signed integer |
8 |
sint16 |
signed integer |
16 |
sint32 |
signed integer |
32 |
sint64 |
signed integer |
64 |
float32 |
floating point number |
32 |
float64 |
floating point number |
64 |
规则:通过设定字节序(大端or小端)实现序列化。
Example:一个unit32类型数据(0x1A3B5C7D)的序列化。
| Byte0 | Byte1 | Byte2 | Byte3 | |
大端 (Big Endian) |
1A | 3B | 5C |
7D |
小端 (Little Endian) |
7D | 5C | 3B | 1A |
结构体(Structs)的序列化
定义:结构体由多个数据元素构成,也可嵌套另一个结构体。
规则:
①将结构体的数据元素顺序排列,然后将各个元素依次进行序列化。
②可增加Length Field来指示结构体中数据元素的字节长度,而嵌套的结构体,也同样需要增加Length Field。
Example: Struct_1包含一个unit32类型的数据,一个float32类型的数组和嵌套的结构体Struct_2,序列化的过程见下图。

定长字符串(Fixed Length Strings)的序列化
定义:String由一系列的Unicode字符构成,并以“\0”(0x00)结束。
规则:
①在String之前增加BOM(Byte Order Mark),用以识别编码类型(UTF8,UTF16BE, UTF16LE)。
UTF编码 |
Byte Order Mark (BOM) |
UTF-8 |
EF BB BF |
UTF-16BE |
FF FE |
UTF-16LE |
FE FF |
②填加String的编码数据流。
③结束符:UTF8以1个“\0”(0x00)结束,UTF16以2个“\0”(0x00,0x00)结束。
Example:假设SOME/IP数据段包含两个字符串成员,分别以UTF8和UTF16LE编码,具体如下:
➤成员1(UTF8,长度18字节):“怿星EPT”(对应编码:E680BF, E6989F, 45, 50, 54)
➤成员2(UTF16LE,长度18字节): “招聘ing”(对应编码:62DB, 8058, 0069, 006E, 0067)
注:黄色填充部分为结束符”\0”; 红色填充部分为未用字节的填充。
动态长度字符串(Dynamic Length Strings)的序列化
规则:基于定长String的规则,在BOM之前增加Length Field,以指示动态字符串字节长度。
Example: 假设我们要传输歌曲名称,以UTF8编码(设定Length Field为2bytes)。
➤歌曲1:“贝贝”(对应编码:E8B49D,E8B49D)
➤歌曲2:“Familia”(对应编码:46, 61, 6D, 69, 6C, 69, 61)

定长数组(Fixed Length Arrays)的序列化
定义:数组是相同类型数据的集合。
规则:依据数组元素的顺序依次排列,并进行序列化。
Example:一维数组由3个元素(unit8类型)构成,序列化的过程见下图。

动态长度数组(Dynamic Length Arrays)的序列化
规则:基于定长数组序列化规则,在Arrays之前增加Length Field,以指示数组中有效元素的字节大小。
Example:设定Length Field为2bytes,一维数组由3个元素(unit16类型)构成,序列化的过程见下图。

其他类型数据(如: union, multidimensional arrays等)的序列化不再赘述,可以参考SOME/IP规范。
简单来讲,通过SOME/IP数据序列化的过程,保证了数据传输的有序性,使Client能够正确解析从Server端发送过来的数据。以上是本次分享的内容,后续我们将继续与您分享更多关于汽车以太网技术的专题介绍。
相关精彩推荐:

![]()
怿星一意,专注车载
引领汽车科技新高度


