SOME/IP의 Payload는 인터페이스 명세가 정의한 파라미터 목록을 바탕으로 직렬화된다. 명세되지 않은 파라미터는 역직렬화 과정에서 무시되며, 모든 파라미터의 정확한 위치와 메모리 정렬도 인터페이스 명세가 정한다[1].

기본 데이터 타입

타입설명크기
booleanTRUE/FALSE 값8비트
uint8 / uint16 / uint32 / uint64부호 없는 정수8 / 16 / 32 / 64비트
sint8 / sint16 / sint32 / sint64부호 있는 정수8 / 16 / 32 / 64비트
float32IEEE 754 binary32(단정밀도)32비트
float64IEEE 754 binary64(배정밀도)64비트

파라미터의 바이트 순서는 파라미터마다 설정으로 정해진다[1].

구조체

구조체는 in-memory 레이아웃에 가깝게 직렬화된다 — 멤버를 선언 순서대로, 중첩된 구조체도 깊이 우선(depth-first)으로 풀어헤쳐 하나의 바이트열로 이어붙인다. SOME/IP 구현은 정렬을 위한 패딩을 자동으로 삽입하지 않으므로, 패딩이 필요하면 데이터 타입 정의에서 직접 지정해야 한다[1].

Struct_1 uint32 a float32 b[2] Struct_2 c uint32 d float32 e[2] 직렬화 a b_1 b_2 d e_1 e_2

Struct_2 안에 중첩된 Struct_3 f도 같은 규칙으로 이어져, 최종 바이트열은 트리 순회 순서를 그대로 따른다.

문자열

문자열은 항상 \0으로 끝나며, 맨 앞에 BOM(Byte Order Mark)을 붙여 UTF-8·UTF-16 등 인코딩을 구분한다[1].

고정 길이 문자열은 전체 길이(\0 포함)를 데이터 타입 정의가 미리 정하고, 가변 길이 문자열은 문자열 앞에 길이 필드를 붙여 그때그때 실제 길이를 담는다[1].

배열

배열의 크기는 인터페이스 정의가 정한다. 고정 길이 배열은 1차원뿐 아니라 다차원도 지원하며, 다차원 배열은 C/C++의 메모리 레이아웃과 같은 행 우선(row-major) 순서로 직렬화된다[1].

가변 길이 배열은 문자열과 마찬가지로 앞에 배열 전체의 바이트 길이를 담는 길이 필드가 붙는다[1].

Union

서로 다른 데이터 타입 중 하나를 실행 시점에 선택해 담는 파라미터가 Union(Variant)이다. 수신 측이 실린 타입을 알 수 있도록, Union은 데이터 앞에 길이 필드와 타입 필드를 붙여 직렬화한다 — 길이 필드는 뒤따르는 데이터·패딩의 바이트 수를, 타입 필드는 그 데이터의 타입을 가리킨다[1].

예를 들어 uint8과 uint16 중 하나를 담는 Union을 길이 필드 32비트, 32비트 경계 패딩으로 설정하면 다음과 같이 직렬화된다[1]:

LengthType데이터
0x0000 00041uint8 값 + 패딩 3바이트
0x0000 00042uint16 값 + 패딩 2바이트

이 Length·Type 필드는 SOME/IP 헤더와 마찬가지로 구조 해석에 쓰이는 메타데이터이므로, 파라미터 자체의 바이트 순서 설정과 무관하게 항상 네트워크 바이트 순서로 인코딩된다[1].

참고문헌

[1]
AUTOSAR, “SOME/IP Protocol Specification, AUTOSAR FO, Release R23-11”, 2023.