개인 공부

Android Protocl Buffers ver.3 사용하기 proto3

Machine_웅 2022. 12. 21. 13:23
728x90
반응형

1. build.gradle(모듈)

plugins {
    id 'com.android.application'
    id ('com.google.protobuf') version "0.8.17"
}

 추가

id ('com.google.protobuf') version "0.8.17"     

 

dependencies {
	..... 
    // Proto Buffer
    implementation 'androidx.datastore:datastore:1.0.0'
    implementation 'com.google.protobuf:protobuf-javalite:3.19.4'
}

 추가 

 implementation 'androidx.datastore:datastore:1.0.0'
 implementation 'com.google.protobuf:protobuf-javalite:3.19.4'

android {
 ...
 
}
protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.14.0"
    }

    // Generates the java Protobuf-lite code for the Protobufs in this project. See
    // https://github.com/google/protobuf-gradle-plugin#customizing-protobuf-compilation
    // for more information.
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                java {
                    option 'lite'
                }
            }
        }
    }
}


dependencies {
 ... 
}

protobuf 블럭 추가 


2. proto 파일 정의

 

src/main 아래로 가보면 기본적으로

 java, res 라는 디렉토리가 존재합니다.

여기에 proto라는 디렉토리를 하나 만들어줍니다

 

 

 

 

 

 

 

 

 

 

 

 

그리고 샘플 proto 파일을 하나 만듭니다.

저는 snowdeer_sample.proto라는 이름으로 만들었습니다.

 

Android Studio의 ProjectView에서 보기 모드가 Android로 되어 있으면

해당 위치가 제대로 보이지 않기 때문에 Project 등으로 변경해줍시다.

 

snowdeer_sample.proto

syntax = "proto2";

package com.snowdeer.sample;

option java_package = "com.snowdeer.sample.proto";
option java_outer_classname = "SampleProto";

message User {
  required int32 id = 1;
  required string name = 2;
  optional string address = 3;

  enum PhoneType {
    UNKNOWN = 0;
    MOBILE = 1;
    HOME = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = UNKNOWN];
  }

  repeated PhoneNumber phoneNumbers = 4;
}

message UserList {
  repeated User users = 1;
}

 

빌드

이제 모듈 빌드를 해봅니다. 빌드하고 나면 build/generated/source/... 디렉토리 아래에 위에서 정의한 이름(예제에서는 SampleProto)의 Java 파일이 생성된 것을 확인할 수 있습니다.

이제 Activity에서는 다음과 같이 사용을 해볼 수 있습니다.

 

, 값을 바꾸고 싶거든 또 다른 객체를 생성해야 한다는 이야기이며, Message 클래스는 Builder 클래스의Build() 메소드를 통해서만 생성이 가능하다.

 

package com.snowdeer.protobufexample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.snowdeer.sample.proto.SampleProto.User;
import com.snowdeer.sample.proto.SampleProto.User.PhoneNumber;
import com.snowdeer.sample.proto.SampleProto.User.PhoneType;

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    PhoneNumber pn = PhoneNumber.newBuilder()
        .setType(PhoneType.MOBILE)
        .setNumber("010-1111-2222")
        .build();

    User user = User.newBuilder()
        .setId(100)
        .setName("snowdeer")
        .setAddress("Seoul")
        .addPhoneNumbers(pn)
        .build();

    Log.i("snowdeer", "[snowdeer] user: " + user.toString());
  }
}

 

실행 결과

   address: "Seoul"
    id: 100
    name: "snowdeer"
    phone_numbers {
      number: "010-1111-2222"
      type: MOBILE
    }

.proto 파일로부터 발생되는 것은?
.proto 파일에 대해 protocol buffer 컴파일러를 실행시키면, 컴파일러는 여러분이 선택한 언어로 코드를 만들어낸다.
    * C++에서는, .pb.h와 .pb.cc 파일이 만들어지는데, 각 message 타입을 위한 클래스들이 있다.
    * Java에서는, .java 파일이 만들어지는데, 각 message 타입을 위한 클래스 뿐만 아니라 그 클래스의 인스턴스를 생성해주는 특별한 Builder 클래스도 있다.
    * Python은 약간 다르다. Python 컴파일러는 각 message 타입의 정적 descriptor를 가지는 모듈을 만들어내는데, 이것은 런타임시에 필요한 Python 데이터 접근 클래스를 생성하기 위해 메타클래스와 함께 사용된다.
    * Go에서는, .pb.go 파일이 만들어지는데, 각 message 타입을 위한 타입을 가지고 있다.


 


스칼라 값 타입
message 스칼라 필드는 다음 중 하나의 타입을 가진다.
   * double
    * float
    * int32. 변수 길이 인코딩시 사용. 음수에는 비효율적임.
    * int64. 변수 길이 인코딩시 사용. 음수에는 비효율적임.
    * uint32. 변수 길이 인코딩시 사용.
    * uint64. 변수 길이 인코딩시 사용.
    * sint32. 변수 길이 인코딩시 사용. 부호있는 값.
    * sint64. 변수 길이 인코딩시 사용. 부호있는 값.
    * fixed32. 항상 4바이트. 값이 2^28보다 크면 더 효율적임.
    * fixed64. 항상 8바이트. 값이 2^56보다 크면 더 효율적임.
    * sfixed32. 항상 4바이트. 
    * sfixed64. 항상 8바이트.
    * bool.
    * string. 문자열은 항상 UTF-8 인코딩이거나 7비트 ASCII 이어야 함.
    * bytes. 임의의 바이트 배열을 포함할 수 있음.


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

 

언어 가이드 (proto3)  |  Protocol Buffers  |  Google Developers

언어 가이드 (proto3) Stay organized with collections Save and categorize content based on your preferences. 이 가이드에서는 .proto 파일 구문을 포함하여 프로토콜 버퍼 언어를 사용하여 프로토콜 버퍼 데이터를 구조

developers.google.com

https://developer.android.com/codelabs/android-proto-datastore?hl=ko#4 

 

Proto Datastore를 사용하여 작업하기  |  Android Developers

이 Codelab에서는 SharedPreferences를 대체하도록 새롭게 개선된 데이터 저장 솔루션인 Jetpack Proto Datastore를 통합하도록 샘플 앱을 수정합니다.

developer.android.com

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=seban21&logNo=70153343429 

 

java(자바) google protobuf

  0. 들어가며 언제나 그렇듯 박스/굵은 글씨만 봐도 무관한 글입니다. 단, 좀 더 자세히 알...

blog.naver.com

https://developers.google.com/protocol-buffers/docs/javatutorial#writing-a-message

 

Protocol Buffer Basics: Java  |  Protocol Buffers  |  Google Developers

Protocol Buffer Basics: Java Stay organized with collections Save and categorize content based on your preferences. This tutorial provides a basic Java programmer's introduction to working with protocol buffers. By walking through creating a simple example

developers.google.com

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=oidoman&logNo=220773055827 

 

Protocol Buffers

https://developers.google.com/protocol-buffers/docs/overview 개발자 가이드 Protocol Buffers 란 무...

blog.naver.com

 

 

사용 방법 관련 참고

https://jeong-pro.tistory.com/190

 

Protocol Buffer 원리로 배우는 고성능 직렬화, 역직렬화 전략! Protocol Buffer 예제 테스트(구글이 쓰는

프로토콜 버퍼가 무엇인가 프로토콜 버퍼(Protocol Buffer = protobuf)란 직렬화 데이터 구조다. (XML, JSON과 유사) 직렬화 데이터 구조를 알려면 직렬화(Serialization)가 뭔지 알아야한다. 꽤 긴데 천천히 설

jeong-pro.tistory.com

 

728x90
반응형

'개인 공부' 카테고리의 다른 글

Protocol Buffer 사용2  (0) 2022.12.22
Protocol Buffer 사용  (0) 2022.12.22
네트워크 - 버퍼, 버퍼링, 캡슐화 ,큐  (0) 2022.12.20
네트워크 - 채널, 터널링  (0) 2022.12.20
네트워크 - PDU , MTU  (0) 2022.12.20