이 오버 헤드는 아주 간단하게는 20 각 개체가 시작하고 끝나는 위치를 알 필요가있는 정보입니다. 형식을 위반하지 않고 여기에서 다른 작업을 수행 할 수있는 방법은 없습니다 (예 : 사양과 반대되는 작업).
당신은 정말 처참한 세부하려면 다음
배열 또는 목록 (우리가 제외하면 "포장"여기에 적용되지 않습니다) 서브 메시지를 단순히 반복 블록을. 하위 메시지에는 두 가지 레이아웃이 있습니다. 문자열 및 그룹. 끈으로, 레이아웃은 :
header
가 (필드 1이 경우 육각 08), 와이어 형의 필드 번호의 varint 부호화 매쉬이다
[header][length][data]
, length
는 varint 인코딩 크기는 data
이고 데이터는 하위 오브젝트 자체입니다. 작은 개체 (data
128 바이트 미만)의 경우 필드 번호 (15보다 큰 필드는 더 많은 공간을 차지함) 및 b : 데이터의 크기에 따라 개체 당 2 바이트의 오버 헤드를 의미합니다. 기로
는, 레이아웃은 : header
가 와이어 타입 및 필드 번호 (필드 1이 경우 육각 0B)의 varint 부호화 매쉬이다
[header][data][footer]
, data
가있다 하위 오브젝트 및 footer
은 오브젝트의 끝을 나타내는 또 다른 varint mash입니다 (이 경우 필드 1의 경우 16 진수 0C).
그룹은 일반적으로 덜 선호되지만, data
크기가 커지면 오버 헤드가 발생하지 않는다는 이점이 있습니다. 작은 필드 번호 (16 미만)의 경우 오버 헤드는 객체 당 2 바이트입니다. 물론 큰 필드 번호에 대해서는 두 배를 지불해야합니다.
Foo 자체는 무료입니까? 또한 약간의 공간이 필요합니까? – user492238
약간의 공간이 필요하지만 22 바이트는 많은 공간입니다! – Martin
1340의 상단에있는 22 바이트는 '순전히'아니며, 분명히 직렬화를위한 것이 아닙니다. 너의 인생을 따라 가라. –