구글 프로토버퍼란?
Google Protocol Buffers(protobuf)는 데이터 직렬화 형식으로 사용되는 강력하고 효율적인 도구로, 다양한 언어와 플랫폼 간에 데이터를 교환하고 저장하기 위해 사용됩니다.
효율적인 직렬화: protobuf는 바이트 크기 측면에서 효율적입니다. 작은 크기의 직렬화된 데이터를 생성하며, 이는 데이터를 네트워크로 전송하거나 디스크에 저장할 때 대역폭과 저장 공간을 절약합니다.
빠른 역직렬화: protobuf 메시지는 효율적인 이진 형식으로 저장되므로 역직렬화 속도가 빠릅니다. 데이터를 직렬화된 형식에서 메모리 객체로 변환하는 작업이 빠르게 수행됩니다.
이식성: protobuf는 언어 중립적인 형식으로 데이터를 정의하며, 이로 인해 다양한 프로그래밍 언어와 플랫폼 간에 데이터 교환이 가능합니다. Protocol Buffers는 C++, Java, Python, C#, 등 여러 프로그래밍 언어에서 사용할 수 있는 구현체를 제공합니다.
데이터 규모 변화 대응: 스키마 변경을 허용하는 유연성을 제공하므로, 데이터 스키마가 변경되더라도 이전 버전과의 호환성을 유지할 수 있습니다. 이것은 시스템 업데이트 및 업그레이드 시 유용합니다.
자동 코드 생성: protobuf의. proto 스키마 파일을 사용하여 각 언어에 대한 코드를 자동으로 생성할 수 있습니다. 이로 인해 데이터 모델과 직렬화 코드를 일관성 있게 유지하기 용이합니다.
확장성: Protocol Buffers는 필요에 따라 사용자 정의 타입 및 필드를 추가하여 데이터 모델을 확장할 수 있는 메커니즘을 제공합니다.
구글 프로토 버퍼 다운로드
구글 프로토콜 버퍼 변환기 다운로드 Url
https://github.com/protocolbuffers/protobuf/releases/tag/v3.12.3
- 다운로드한 변환기 폴더
- protoc-3.12.3-win64\bin 폴더 안에 보면 protoc.exe 실행 파일이 존재한다. 해당 파일은. proto에서 정의한 프로토 버퍼를 c++, c#, java 등 스크립트로 변환해 주는 실행 파일이다.
- protoc-3.12.3-win64\bin 폴더 안에 Protocol.proto라는 파일을 생성해 준다.
- 생성한 Protocol.proto에서 정의하고 싶은 구조를 아래와 같이 만들어 준다.
구글 프로토 버퍼 개발자 docs Url
https://developers.google.com/protocol-buffers/docs/csharptutorial
//Protocol.proto 예시
syntax = "proto3";
package Protocol;
import "google/protobuf/timestamp.proto";
option csharp_namespace = "Google.Protobuf.Protocol";
message Person {
string name = 1;
int32 id = 2; // Unique ID number for this person.
string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
repeated PhoneNumber phones = 4;
google.protobuf.Timestamp last_updated = 5;
}
// Our address book file is just one of these.
message AddressBook {
repeated Person people = 1;
}
- protoc.exe는 해당 exe폴더 경로상에서 cmd를 활성화하여 protoc.exe -I=./ --csharp_out=./ ./Protocol.proto 처럼 명령어를 직접 입력하여 실행시켜야 한다.
- . proto가 변경될 때 마다 cmd를 이용하여 명령어를 사용하기 힘들기 때문에 배치파일하나를 같은 경로에 생성한다.
- 배치파일을 열어 프로토콜변환 exe 출력 경로 입력(./ 현재경로)
pushd %~dp0
protoc.exe -I=./ --csharp_out=./ ./Protocol.proto
IF ERRORLEVEL 1 PAUSE
- 배치파일 실행하면 프로토콜 cs파일 생성
- 사용할 위치로 Protocol.cs 이동
- 생성된 Protocol.cs를 프로젝트에서 사용하기 위해서는 Google.Protobuf를 NuGet 패키지에서 설치해야 함.
프로토콜 cs사용하는 방법
Protocol.proto의 구조와 같은 형태로 변환된 cs파일 사용방법은 아래와 같다.
Person person = new Person()
{
Name= "Test",
Id = 1,
Email = "naver.com",
Phones = { new PhoneNumber { Number = "555-4321", Type = PhoneType.Home } }
};
//응용
ushort size = (ushort)person.CalculateSize();//버퍼사이즈
byte[] sendBuffer = new byte[size + 4]; //+4는 프로토콜 헤더를 위해
Array.Copy(BitConverter.GetBytes(size+4), 0, sendBuffer, 0, sizeof(ushort));//헤더크기
ushort protocolld = 1;
Array.Copy(BitConverter.GetBytes(protocolld), 0, sendBuffer, 2, sizeof(ushort));//프로토콜id
Array.Copy(person.ToByteArray(), 0, sendBuffer, 4, size);//보낼 데이터
//기본
//int size = person.CalculateSize();//버퍼사이즈
//byte[] sendBuffer = person.ToByteArray();//객체를 버퍼로 변경
//Person person2 = new Person();
//person2.MergeFrom(sendBuffer);//버퍼를 객체로 변경
.proto를 프로젝트로 Link하는 법
프로젝트를 선택하고 마우스 오른쪽 버튼을 클릭 → 추가(Add) → 기존 항목(Existing Item)을 선택.
-> 모든파일 -> Link 할 파일 선택 -> 추가 -> 링크로 추가
빌드 이벤트를 사용한 bat 프로 그램 자동화
프로젝트를 선택하고 마우스 오른쪽 버튼을 클릭 → 속성 → 빌드 → 이벤트 → 빌드 전 이벤트
CALL명령어는 사용하면 bat프로그램을 실행한다는 명령어이다.
자신이 만든 경로의 bat프로그램 경로를 적절히 작성한다.
웹으로 Protocol.proto 사용 방법
https://protogen.marcgravell.com/
Protobuf Code Generator and Parser | protobufnet | Marc Gravell
protogen.marcgravell.com
데이터 타입
Google Protocol Buffers (protobuf)는 데이터 직렬화 및 구조화를 위한 이진 형식의 포맷을 정의하는 데 사용되는 플랫폼 중립적인 데이터 직렬화 포맷입니다. protobuf는. proto 파일을 사용하여 데이터 타입을 정의하고, 해당 정의를 기반으로 데이터를 직렬화하고 역직렬화합니다. 아래는 protobuf에서 사용할 수 있는 일반적인 데이터 타입 목록입니다:
- 숫자형 (Numeric Types):
- double: 부동 소수점 숫자 (64비트)
- float: 부동 소수점 숫자 (32비트)
- int32: 32비트 정수
- int64: 64비트 정수
- uint32: 부호 없는 32비트 정수
- uint64: 부호 없는 64비트 정수
- sint32: 가변 정수 인코딩을 사용하는 32비트 정수
- sint64: 가변 정수 인코딩을 사용하는 64비트 정수
- fixed32: 고정 크기 32비트 정수
- fixed64: 고정 크기 64비트 정수
- sfixed32: 부호가 있는 고정 크기 32비트 정수
- sfixed64: 부호가 있는 고정 크기 64비트 정수
- 불리언 (Boolean):
- bool: 참 또는 거짓 값을 나타내는 부울
- 문자열 (Strings):
- string: 유니코드 문자열
- 바이트 배열 (Bytes):
- bytes: 이진 데이터 또는 바이트 배열
- 열거형 (Enums):
- enum: 열거형 상수를 정의하고, 이러한 상수 중 하나를 가질 수 있는 필드를 생성
- 메시지 (Message):
- 사용자 정의 데이터 타입을 정의할 수 있는 메시지 타입을 생성할 수 있습니다. 메시지 내부에 다양한 필드를 포함할 수 있으며, 재귀적으로 다른 메시지 유형을 포함할 수도 있습니다.
protobuf를 사용하여 데이터를 구조화하고 직렬화하면, 다양한 프로그래밍 언어에서 동일한 구조를 사용하여 데이터를 역직렬화하고 처리할 수 있습니다. 이것은 특히 다른 시스템 간 데이터 교환을 위한 효율적인 방법으로 사용됩니다.
'VisualStudio > C#서버' 카테고리의 다른 글
[C#서버] Akka.net과 Cluster Part.5 적용해보자! (0) | 2025.01.21 |
---|---|
[C#서버] google.protobuf.Timestamp Json Deserialize 사용방법 (0) | 2025.01.21 |
[C#서버] Akka.net과 Cluster Part.4 (3) | 2024.10.08 |
[C#서버] Akka.net과 Actor모델 Part.3 (3) | 2024.09.30 |
[C#서버] Akka.net과 Actor모델 Part.2 (0) | 2024.09.13 |