SOME/IP의 Payload는 인터페이스 명세가 정의한 파라미터 목록을 바탕으로 직렬화된다. 명세되지 않은 파라미터는 역직렬화 과정에서 무시되며, 모든 파라미터의 정확한 위치와 메모리 정렬도 인터페이스 명세가 정한다[1].
기본 데이터 타입
| 타입 | 설명 | 크기 |
|---|---|---|
| boolean | TRUE/FALSE 값 | 8비트 |
| uint8 / uint16 / uint32 / uint64 | 부호 없는 정수 | 8 / 16 / 32 / 64비트 |
| sint8 / sint16 / sint32 / sint64 | 부호 있는 정수 | 8 / 16 / 32 / 64비트 |
| float32 | IEEE 754 binary32(단정밀도) | 32비트 |
| float64 | IEEE 754 binary64(배정밀도) | 64비트 |
파라미터의 바이트 순서는 파라미터마다 설정으로 정해진다[1].
구조체
구조체는 in-memory 레이아웃에 가깝게 직렬화된다 — 멤버를 선언 순서대로, 중첩된 구조체도 깊이 우선(depth-first)으로 풀어헤쳐 하나의 바이트열로 이어붙인다. SOME/IP 구현은 정렬을 위한 패딩을 자동으로 삽입하지 않으므로, 패딩이 필요하면 데이터 타입 정의에서 직접 지정해야 한다[1].
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]:
| Length | Type | 데이터 |
|---|---|---|
| 0x0000 0004 | 1 | uint8 값 + 패딩 3바이트 |
| 0x0000 0004 | 2 | uint16 값 + 패딩 2바이트 |
이 Length·Type 필드는 SOME/IP 헤더와 마찬가지로 구조 해석에 쓰이는 메타데이터이므로, 파라미터 자체의 바이트 순서 설정과 무관하게 항상 네트워크 바이트 순서로 인코딩된다[1].