문제

Google 프로토콜 버퍼와 ASN.1 (인코딩 당)의 가장 눈에 띄는 차이점은 무엇입니까? 내 프로젝트의 경우 가장 중요한 문제는 직렬화 된 데이터의 크기입니다. 둘 사이의 데이터 크기 비교를 한 사람이 있습니까?

도움이 되었습니까?

해결책

ASN.1 작업을 수행 한 지 오래되었지만 크기는 유형의 세부 사항과 실제 데이터에 따라 다를 가능성이 높습니다.

나는 할 것이다 강하게 모두 프로토 타입을 추천하고 실제 데이터를 비교할 것을 권장하십시오.

프로토콜 버퍼에 반복적 인 원시 유형이 포함 된 경우 프로토콜 버퍼의 최신 소스를보아야합니다. 이제 훨씬 더 공간 효율적인 "포장 된"형식으로 표시 될 수 있습니다. (내 C# 포트가 있습니다 단지 지난 주 에이 기능을 따라 잡았습니다.)

다른 팁

정렬되지 않은 PER과 함께 ASN.1을 사용하고 적절한 제약 조건 (예 : 정수의 하한/상한, 목록의 길이의 상한 등을 지정)을 사용하여 데이터 유형을 정의하는 경우 인코딩은 매우 작습니다. 필드 사이의 정렬 또는 패딩과 같은 것들에 대해서는 비트 낭비가 없으며, 각 필드는 허용 된 값 범위를 유지하는 데 필요한 최소 비트 수로 인코딩됩니다. 예를 들어, 유형 정수 필드 (1..8)는 3 비트로 인코딩됩니다 (1 = '000', 2 = '001', ..., 8 = '111'). 그리고 4 개의 대안을 가진 선택은 선택된 대안이 차지하는 2 비트 (선택된 대안을 나타내는)와 비트를 차지할 것입니다. ASN.1에는 많은 출판 된 표준에서 성공적으로 사용 된 다른 많은 흥미로운 기능이 있습니다. 예를 들어 확장 마커 ( "...")가 있는데, 시퀀스, 선택, 열거 및 기타 유형에 적용될 때 다른 유형의 사양 버전을 구현하는 엔드 포인트 간의 역 및 전진 호환성을 가능하게하는 확장 마커 ( "...")가 있습니다.

포장/인코딩 된 메시지의 크기가 중요 할 때 Protobuf가 포장 할 수 없다는 사실도 주목해야합니다. repeated a가 아닌 필드 primitive numeric type, 이것을 읽으십시오 자세한 내용은.

이것은 해당 유형의 메시지가있는 경우 다음과 같은 문제입니다. (주석은 실제 값 범위를 정의합니다)

message P{
    required sint32 x = 1; // -0x1ffff  to  0x20000
    required sint32 y = 2; // -0x1ffff  to  0x20000
    required sint32 z = 3; // -0x319c  to   0x3200
}
message Array{
    repeated P ps = 1;
    optional uint32 somemoredata = 2;
}

배열 길이가있는 경우, 예를 들어, 32는 배열에 실제로 포함 된 값에 따라 Protobuf가있는 약 250 ~ 450 바이트의 포장 된 메시지 크기를 초래할 수 있습니다. 전체 32 비트 범위를 사용하는 경우 1000 바이트로 증가 할 수 있습니다. 또는 사용하는 경우 int32 대신에 sint32 그리고 음수 값이 있습니다.

원시 데이터 blob (z를 다음과 같이 정의 할 수 있다고 가정합니다. int16 값)은 320 바이트 만 소비하므로 ASN.1 메시지입니다 언제나 최대 값이 실제로 32 비트가 아니라 19 비트 (x, y) 및 15bit (z)이므로 320 바이트보다 작습니다.

Protobuf 메시지 크기는이 메시지 정의로 최적화 될 수 있습니다.

message Ps{
    repeated sint32 xs = 1 [packed=true];
    repeated sint32 ys = 2 [packed=true];
    repeated sint32 zs = 3 [packed=true];
}
message Array{
    required Ps ps = 1;
    optional uint32 somemoredata = 2;
}

이로 인해 약 100 바이트 (모든 값은 0), 300 바이트 (범위 최대 값) 및 500 바이트 (모든 값은 32 비트 값이 높음) 사이의 메시지 크기가 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top