반응형
※.proto ver 3을 기준으로 한 포스팅입니다.
https://protobuf.dev/getting-started/csharptutorial/
공식 문서도 참고해서 보시면 좋습니다.
좀더 상세한 문법들을 살펴보고 싶다면 아래 MS의 문서도 참고하시면 됩니다.
https://learn.microsoft.com/ko-kr/aspnet/core/grpc/protobuf?view=aspnetcore-8.0
1. 살펴보기
syntax = "proto3";
package Gomoku;
import public "ProtoDefine.proto";
option csharp_namespace = "Gomoku.Protocol";
enum MsgId {
S_CONNECT = 0;
S_LOGIN = 1;
C_LOGIN = 2;
S_ENTER_LOBBY = 3;
C_ENTER_LOBBY = 4;
S_ENTER_ROOM = 5;
C_ENTER_ROOM = 6;
S_PUT = 7;
C_PUT = 8;
}
message S_Connect {
int32 userDbId = 1;
bool loginOk = 2;
}
...
syntax와 package는 필수로 넣어 주셔야 합니다.
변수 | 뜻 |
syntax | .proto의 버전 |
package | 해당 .proto에 있는 클래스들의 기본 네임스페이스 |
import | 다른 .proto 참조 |
option csharp_namespace | 해당 .proto에 있는 클래스들의 네임스페이스 재정의 |
enum | 열거형 변수 |
message | 클래스 |
2. 주의점들
- import를 할 때 상위 폴더를 참조할 수 없습니다. (./ ../ 안됌)
- package는 말 그대로 .proto에 있는 클래스와 열거형 변수들을 한곳에 포장해놓는거기 때문에
import로 참조시 참조할 .proto의 package 또한 같아야합니다. - enum안에 있는 변수들은 반드시 0부터 시작해야 합니다.
3. 기본 자료형들
Protobuf 형식 | C# 형식 |
double | double |
float | float |
int32 | int |
int64 | long |
uint32 | uint |
uint64 | ulong |
sint32 | int |
sint64 | long |
fixed32 | uint |
fixed64 | ulong |
sfixed32 | int |
sfixed64 | long |
bool | bool |
string | string |
bytes | ByteString |
repeated T | List<T> |
map<T, T> | Dictionary<T, T> |
위 자료형들은 모두 기본값을 가지고 있어서 null을 할당시 crash가 발생할 수 있습니다.
nullable 변수들은 따로 있으니 위에 소개한 공식문서 2번째를 참고하시면 됩니다.
그 외에도 시간과 관련된 자료형도 있습니다.
4. 빌드
protoc -I=$SRC_DIR --csharp_out=$DST_DIR $SRC_DIR/파일명.proto
ex) protoc -I="./" --csharp_out="./" "./Protocol.proto"
문제가 있으면 친절하게 어디서 오류가 났는지 다 알려줍니다.
빌드했을 때 오류가 없으면 정장석으로 파일명.cs가 나오게 됩니다.
그 cs파일을 프로젝트 내에 넣고 지정해준 namespace를 using하면 사용할 수 있습니다.
5. 잡지식
- option csharp_namespace는 말 그대로 네임스페이스를 재정의하는 "option" 이어서 꼭 할 필요 없습니다.
없으면 package 값을 네임스페이스로 지정합니다. - 모든 클래스들은 IMessage<T>를 상속받습니다.
- 클래스들은 당연히 null이 될 수 있습니다. (new로 할당 또한 됩니다.)
- Enum 멤버 변수들의 변수명을 각단어를 _로 구분하고 열거형 이름_변수명으로 할 때 변수명으로만 지정됨
(아마 변수명 중복때문에 넣은 기능인것 같음)
ex) enum UserState {
USER_STATE_NONE = 0; → None으로 변수명 지정
USER_STATE_WAIT = 1; → Wait으로 변수명 지정
}
반응형
'C#' 카테고리의 다른 글
[C#] Extension Method (0) | 2023.12.12 |
---|---|
[C#] Task 와 Thread의 차이점 (0) | 2023.10.26 |