[Google Protobuf] For Java in Android Studio - 설치 및 proto 파일 컴파일

Posted by [하늘이]
2020. 1. 30. 12:04 IT/C, C++
반응형

[Google Protobuf] For Java in Android Studio
설치 및 proto 파일 컴파일


※ 관련글

  • Google Protobuf
  1. [Google Protobuf] For Java in Android Studio - 설치 및 proto 파일 컴파일
  2. [Google Protobuf] For Java in Android Studio - Gen Java 파일 Android Studio 적용
  3. [Google Protobuf] For Java in Android Studio - Basic example code 기본 소스 코드 사용 샘플
  4. [Google Protobuf] For C++ in Linux - Settings C++ 빌드 환경 만들기
  5. [Google Protobuf] For C++ in Linux - Basic example code 기본 소스 코드 사용 샘플
  • Nanopb Basic type value example
  1. [Nanopb for Google protobuf] Basic type proto sample
  2. [Nanopb for Google protobuf] Basic type proto sample - Sample proto file
  3. [Nanopb for Google protobuf] Basic type proto sample - Encode sample code
  4. [Nanopb for Google protobuf] Basic type proto sample - Decode sample code
  • Nanopb String / bytes value example
  1. [Nanopb for Google protobuf] String/Bytes type proto
  2. [Nanopb for Google protobuf] String/Bytes type proto - Sample proto file 
  3. [Nanopb for Google protobuf] String/Bytes type proto - Encode example code 1
  4. [Nanopb for Google protobuf] String/Bytes type proto - Encode example code 2
  5. [Nanopb for Google protobuf] String/Bytes type proto - Decode example code
  • Nanopb basic submsg example
  1. [Nanopb for Google protobuf] Sub message - Example proto file
  2. [Nanopb for Google protobuf] Sub message - Encode example code
  3. [Nanopb for Google protobuf] Sub message - Decode example code
  • Nanopb array submsg value example

  1. [Nanopb for Google protobuf] Array Sub message - Example proto file
  2. [Nanopb for Google protobuf] Array Sub message - Encode example code
  3. [Nanopb for Google protobuf] Array Sub message - Decode example code



* Java 구글 프로토 버퍼 소스 코드 다운로드

https://github.com/protocolbuffers/protobuf/releases

 

* Tutorials

https://developers.google.com/protocol-buffers/docs/tutorials

 

* .proto 파일 작업

가이드 문서에 있는 "addressbook.proto" 의 내용으로 샘플을 만든다.

[.proto 파일 문법은 Java/C++ 유사하지만 아래 참조 문서를 이용하여 만들어야 된다.

https://developers.google.com/protocol-buffers/docs/proto]

 

# syntax 정의

proto2 / proto3 등을 넣을 수 있다.

[눈치밥으로 프로토콜 버전 정의라고 생각하면 될듯..넘어가자]

 

# package 선언을 해야 함.

package tutorial;

proto 파일들의 충돌을 막는데 사용된다. 

 

# Gen되는 Class 의 이름과 패키지 정보를 선언한다.

- 선언하지 않는 경우 class 명은 proto 파일 이름이 camel case 로 자동 생성되며, 

- 패키지는 위쪽에 선언한 package 명과 유사한 것이 자동 붙게 된다.

 

# Message 정의 

- 메시지는 데이터 필드들이 있는 형태 이다.

- 타입은 boo, int32, float, double, string 등이 사용된다.

- Message 내부 class 와 같은 형태의 데이터를 넣을 수 있다.

ex) addressbook.proto 파일에 

message Person {

  message PhoneNumber{}

  }
}

- proto 파일 내부에 message 를 여러개 넣을 수 있다.

- enum 타입도 정의 가능 [ex) PhoneType]

- 각 element 들은  " = 1", " = 2" 으로 Tag 숫자 정의하여야 하며 이것은 나중에 키 값이 된다.

Tag 숫자는 1 ~ 15 지정이 가능하다.

각 필드들은 annotated 스트링이 붙게 된다.

required : 반듯이 초기 값이 설정되어야 한다. 그렇지 않은 경우 빌드시 RuntimeException 발생하고

사용 시 IOException 발생.

optional : 초기값을 넣을수도 있고 넣지 않을 수도 있다. 넣지 않는 경우 초기값이 자동 설정된다.

repeated : ArrayList 형태의 데이터 타입을 정의하는 데 사용한다.

ex) repeated PhoneNumber phones = 4;

- 상속은 지원하지 않는다.

 

# 생성된 proto 파일을 complie 시켜 class 파일을 얻는다.

protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto

* -I : protoc.exe 파일이 있는 경로, 같은 위치면 옵션 없어도 된다.

protoc --java_out=$DST_DIR $SRC_DIR/addressbook.proto

* --java_out : Java Class 파일 Gen을 위한 옵션

* $DST_DIR : Java(Class) 파일이 생성되는 경로

* $SRC_DIR : 빌드하려는 *.proto 파일이 있는 경로

Ex)

같은 폴더에 poroc.exe를 넣고 compile 폴더 하나 만들어서 아래와 같이 compile 시

protoc --java_out=./compile ./addressbook.proto

ex1\compile\com\example\tutorial\AddressBookProtos.java 가 생성된다. 무려 104kb 의 코드가 생성됨.

* 참조 사이트

* Java Api Ref : https://developers.google.com/protocol-buffers/docs/reference/java/index.html

* Proto file Language Guide : https://developers.google.com/protocol-buffers/docs/proto

* Java Generated Code : https://developers.google.com/protocol-buffers/docs/reference/java-generated

*  proto file message 내에 사용가능 타입

.proto Type

Notes

Go Type

double

 

*float64

float

 

*float32

int32

Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.

*int32

int64

Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.

*int64

uint32

Uses variable-length encoding.

*uint32

uint64

Uses variable-length encoding.

*uint64

sint32

Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.

*int32

sint64

Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.

*int64

fixed32

Always four bytes. More efficient than uint32 if values are often greater than 228.

*uint32

fixed64

Always eight bytes. More efficient than uint64 if values are often greater than 256.

*uint64

sfixed32

Always four bytes.

*int32

sfixed64

Always eight bytes.

*int64

bool

 

*bool

string

A string must always contain UTF-8 encoded or 7-bit ASCII text.

*string

bytes

May contain any arbitrary sequence of bytes.

[]byte

 

반응형