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

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

Protocol Buffers는 C#만을 위한 라이브러리는 아닙니다.

Protocol Buffers - Developer guide를 보면 C++, Java, Python에 대해서만 설명을 해줍니다. C#은 third party로 분류 되어 있구요.


사실 third-party로 분류된 언어는 많습니다. 

https://code.google.com/p/protobuf/wiki/ThirdPartyAddOns


위 주소로 방문하시면 아시겠지만 Action Script, Go, D, 얼랭, 루아, 펄, 루비, 스칼라, PHP...헉헉..

많네요.


하지만 본인의 주력 언어는 C#이니까!


제가 세번째 글을 포스트 하는 이유는 C#으로 proto 파일을 만들어 내는 방법을 소개해 드리려 합니다.

C#으로 클래스 구현해놓고 타언어 지원을 위해 proto파일을 직접 만들려고 하면 오류도 생길 수 있고, 귀찮고, 위험하잖아요.


소스는 아래와 같습니다.


class 선언한 곳은 기존 예제와 다를 바 없으니 패스 하시고..

가장 아래 메소드 ProtoFileWrite를 보시겠습니다.


실행파일 폴더에서 proto 폴더를 만든 후

파일 저장 Path를 만들고..

Line 62번째!!

GetProto 일반화 메소드가 있습니다! proto파일을 만들려고 하는 타입을 넘겨주면 프로토 파일을 만들어 줍니다.


proto 파일이 어떻게 생성되었는지 보겠습니다.

위 내용은 Packet.proto입니다.



위 내용은 Test.proto입니다.


어때요? 참쉽죠?ㅋ


이렇게 ProtoBuf-net 에 대해서 알아봤습니다.

사실 ProtoBuf-net에는 많은 기능들이 있는데 전부 알아보지는 못했네요. 아쉽지만 나중에 좋은 꼼수들을 알게 될 경우 포스트 할께요~

'In to the C#' 카테고리의 다른 글

Delegates와 Serialization  (0) 2014.01.17
Dispose in C#  (0) 2014.01.14
Thread Pool과 Task  (0) 2014.01.14
Google Protocol Buffer 사용해보기 with C# - 두번째  (1) 2014.01.14
Google Protocol Buffer 사용해보기 with C# - 첫번째  (0) 2014.01.13
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인 배열이 발생하니까 사용하실때 주의 하라는 점을 말씀드리고 싶었습니다.


잇힝~


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

'In to the C#' 카테고리의 다른 글

Delegates와 Serialization  (0) 2014.01.17
Dispose in C#  (0) 2014.01.14
Thread Pool과 Task  (0) 2014.01.14
Google Protocol Buffer 사용해보기 with C# - 세번째  (0) 2014.01.14
Google Protocol Buffer 사용해보기 with C# - 첫번째  (0) 2014.01.13
In to the C# 2014. 1. 13. 18:36

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

아래 DeathKnight 님께서 추신을 다신 관계로 Protobuf-net에 대해 올리겠습니다.


Protobuf-net.


이름에서도 풍기듯이 .NET 프레임워크에서 사용가능하며, 버전별 빌드를 제공하고 있습니다.

https://code.google.com/p/protobuf-net/


위의 사이트에서 다운을 받을 수도 있고, VisualStudio NuGet에서도 다운로드 받을 수 있습니다.

솔루션 탐색기에서 참조에 protobuf-net을 추가하고, using ProtoBuf를 추가 합니다.


사용방법은 아래와 같습니다.


Line 8 ~ 19까지는 Packet 클래스입니다. [ProtoContract]는 이 클래스는 ProtoBuf-net 직렬화 대상 클래스를 알리는 Attibute 입니다. [Protomember]는 ProtoBuf-net 직렬화 대상 멤버임을 알려주며, 숫자는 Order Number입니다.


Line 21 ~ 32는 Packet 클래스의 세번째 멤버인 리스트에 사용되는 클래스 입니다. 


Line 38 ~ 45에서 테스트용으로 Packet 인스턴스를 채워 주웠구요.


Line 52 ~ 56은 byte 배열로 직렬화 하였습니다. 인스턴스를 MemoryStream 인스턴스에 담은 후 메모리 스트림에서 byte 배열로 변환 합니다.


Line 59 ~ 60은 byte 배열에서 인스턴스로 역직렬화 하였습니다. 그리고 출력하는 내용입니다. 출력 결과는 아래와 같습니다.



타 언어와는 다르게 .proto 파일을 만들 필요가 없으며, generator를 사용할 필요도 없습니다.

우왕 ㅋ굳ㅋ


두번째 ProtoBuf-net 이야기를 기대하세요~ (대단한건 없겠지만요;;;;)

'In to the C#' 카테고리의 다른 글

Delegates와 Serialization  (0) 2014.01.17
Dispose in C#  (0) 2014.01.14
Thread Pool과 Task  (0) 2014.01.14
Google Protocol Buffer 사용해보기 with C# - 세번째  (0) 2014.01.14
Google Protocol Buffer 사용해보기 with C# - 두번째  (1) 2014.01.14