In to the C# 2014. 1. 14. 11:14

Google Protocol Buffer 사용해보기 with C# - 두번째

C#에서 ProtoBuf-net을 사용한다는 것은 굉장히 쉽고, 머리아픈 것들을 한방에 날려버립니다.

다른 언어로 개발된 어플리케이션과 데이터를 주고 받을 때도 문제가 없으며, 제너레이터, proto파일 등을 생각할 필요도 없구요. 다만 약간의 단점도 있습니다. 그것은 패킷에 대한 사이즈를 개발자가 직접 컨트롤 할 수가 없다는 것입니다. (아! 이 것은 ProtoBuf-net의 단점이 아니라 Protocol Buffers의 전반적인 내용입니다!!)


가령 int32형 데이터를 하나 보내는데도 4바이트 이상을 소모할 수가 있다는 것입니다. 하지만, 반대로 size가 줄어들 수도 있습니다.


소스를 보시면 총 4번의 직렬화 결과를 얻었습니다.


Line 19 ~ 23은 SizeTest 인스턴스의 key값이 0일 때, 

Line 25 ~ 29은 SizeTest 인스턴스의 key값이 1일 때,

Line 31 ~ 35은 SizeTest 인스턴스의 key값이 int형 min value일 때,

Line 37 ~ 41은 SizeTest 인스턴스의 key값이 int형 max value일 때 입니다.


결과는 아래와 같습니다.



헐!

대박!


같은 int형의 값이라도 byte 배열의 길이가 달라졌네요;;;

값이 0일 때는 제로배열!!

값이 1일 때는 2Byte

int형 min value 일때는 11Byte 씩이나??

int형 max value 일때는 6Byte 이군요!


사실 이글을 쓰고 있는 저는 왜그러는지 잘 모릅니다; 전 protocol buffers를 개발한 사람이 아니고, 어떻게 구현되었는지 파고 싶지도 않거든요..(파고들어도 모르겠지만 ㅠㅠ)


단지 제가 하고 싶은 얘기는 위와 같은 현상이 일어 날 수 있으니까 특히 값이 0일 경우 길이가 0인 배열이 발생하니까 사용하실때 주의 하라는 점을 말씀드리고 싶었습니다.


잇힝~


그럼 세번째 포스트를 기대하세요~ (아마 세번째 포스트가 올라오지 못하면 이 마지막 라인은 사라질겁니다. 헷;

  • 서재형 2015.01.26 22:03

    내부적으로 variable integer 인코딩을 합니다.
    base 128 encoding 으로 검색해보세요.
    음수일경우에는 최대 10바이트 까지 늘어나는
    문제가 있죠. 이를 지그재그인코딩 이라는
    간단한 기법으로 최적화합니다.
    -1이 1바이트만 차지하게 돼죠.
    프로토버퍼 홈페이지에 자세히 나와 있어요.