Android 에서 protobuf 를 사용 하 는 구체 적 인 예제

5342 단어 Androidprotobuf
간단 한 소개
Google Protocol Buffers 는 Protobuf 라 고 부 르 는데 json 이나 XML 과 유사 하 며 직렬 화 된 구조 데이터 의 메커니즘 이지 만 그것들 보다 더 작고 빠 르 며 간단 하 다.다 중 언어,크로스 플랫폼 도 지원 합 니 다.
현재 주로 두 가지 큰 버 전이 있 는데 그것 이 바로 proto 2 와 proto 3 이다.
그 중에서 proto 2 는 자바,Python,Objective-C,C++를 지원 합 니 다.
proto 3 는 Go,JavaNano,Ruby,C\#에 대한 지원 을 추가 했다.
proto 예

syntax = "proto3";
package tutorial;

import "google/protobuf/timestamp.proto";

option java_package = "com.katyusha.aron.demo";
option java_outer_classname = "AddressBookProtos";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;

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

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  repeated PhoneNumber phone = 4;

}

message AddressBook {
  repeated Person person = 1;
}

Protobuf 는.proto 파일 을 사용 하여 데이터 형식 을 정의 하고 컴 파일 러 를 제공 하여 이 파일 들 을 각종 언어의 소스 코드 로 컴 파일 합 니 다.
message 형식 은 매우 간단 합 니 다.각 유형의 message 는 하나 이상 의 유일한 인 코딩 필드 를 포함 하고 있 으 며,각 필드 는 이름과 값 형식 으로 구성 되 어 있 으 며,값 유형 은 숫자(성형 또는 부동 소수점 형),불 값,문자열,원시 바이트,심지어 다른 message(상기 참조)일 수 있 습 니 다.Protobuf 는 메시지 에 message 를 포함 하여 레이 어 링 을 허용 합 니 다.
주의해 야 할 것 은 모든 속성 에 유일한 tag 가 있 습 니 다.위의 0,1,2...등 이 tag 들 은 매우 중요 합 니 다.Prodobuf 인 코딩 을 할 때 사용 하 는 모든 속성 에 대한 유일한 식별 자―Prodobuf 는 속성 명(name,id,email...)을 사용 하지 않 습 니 다.따라서 하나의 message 를 정의 한 후에 원칙적으로 모든 속성의 tag 를 수정 해 서 는 안 됩 니 다.수정 하면 새로운 오래된 데이터 버 전의 해석 에 오류 가 발생 할 수 있 기 때 문 입 니 다.
키워드
syntax:성명 버 전.예 를 들 어 위의 syntax="proto 3"은 성명 이 없 으 면 기본적으로 proto 2 입 니 다패키지:성명 패키지 명
  • import:가방 가 져 오기.자바 와 유사 합 니 다.예 를 들 어 위 에 timestamp.proto 가방 을 가 져 왔 습 니 다
  • java_package:생 성 된 클래스 를 어떤 자바 패키지 이름 으로 해 야 할 지 지정 합 니 다.이 값 을 명시 적 으로 지정 하지 않 으 면 package 에서 설명 한 자바 패키지 이름 과 간단하게 일치 합 니 다.그러나 이 이름 들 은 보통 도 메 인 이름 으로 시작 하지 않 기 때 문 입 니 다
  • java_outer_classname:이 파일 의 모든 클래스 를 포함 해 야 하 는 클래스 를 정의 합 니 다.만약 당신 이 자바 를 명시 적 으로 주지 않 았 다 면outer_classname 은 파일 이름 을 이니셜 대문자 로 변환 하여 생 성 합 니 다.예 를 들 어 위의 예 에서 컴 파일 된 파일 이름과 클래스 이름 은 Address Bookprotos 입 니 다
  • message:자바 의 class 키워드 와 유사 합 니 다
  • repeated:속성 을 수식 하 는 데 사용 되 며 해당 하 는 속성 은 array 임 을 나타 낸다
  • 더 많은 키 워드 는 참고 할 수 있 습 니 다공식 문서여 기 는 소개 하지 않 습 니 다.
    Android 에서 의 사용
    먼저 프로 토 콜 이 안 드 로 이 드 에서 사용 하 는 프로 세 스 를 살 펴 보 겠 습 니 다.

    먼저 proto 파일 을 만 듭 니 다.이 파일 은 사용 할 데이터 형식 을 정의 합 니 다.
    proto 파일 을 통 해 proto 자바 class 를 컴 파일 하여 생 성 합 니 다.생 성 된 클래스 에는 당신 이 필요 로 하 는 getter/setter 가 포함 되 어 있 습 니 다.이 자바 class 는 우리 가 평소에 사용 하 는 자바 bean 과 유사 하지만 다른 기능 함수 도 많이 포함 되 어 있 습 니 다.안 드 로 이 드 에서 우 리 는 Gradle Plugin for Protobuf 를 통합 하여 proto 파일 을 컴 파일 할 수 있 습 니 다.
    Android Studio 설정
    프로젝트 루트 의 gradle 파일 에 다음 과 같은 내용 을 추가 합 니 다.
    
    buildscript {
        repositories {
          jcenter()
          mavenCentral()
        }
        dependencies {
          classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0'
        }
      }
    app module 의 gradle 파일 에서:
    1.apply plugin:'com.android.application'에 apply plugin:'com.google.protobuf'를 추가 합 니 다.
    2,protobuf 블록 추가(android 와 동급):
    
    protobuf {
      protoc {
        artifact = 'com.google.protobuf:protoc:3.5.1' //             
      }
    
      generateProtoTasks {
        all().each { task ->
          task.builtins {
            remove java
          }
          task.builtins {
            java {}//   java  
          }
        }
      }
    }
    
    
    3,.proto 파일 의 경 로 를 지정 합 니 다:
    
    sourceSets {
        main {
          java {
            srcDir 'src/main/java'
          }
          proto {
            srcDir 'src/main/proto' //  .proto    
          }
        }
      }
    
    4,의존 도 추가:
    
    api 'com.google.protobuf:protobuf-java:3.5.1'
    api 'com.google.protobuf:protoc:3.5.1'
    여기까지 안 드 로 이 드 gradle 환경 이 설정 되 었 습 니 다.이 때 프로젝트 를 컴 파일 할 수 있 습 니 다.proto 자바 class 가 생 성 됩 니 다.이 종 류 는 바로 우리 app 뒤에 사용 할 것 입 니 다.
    코드 예제
    proto 파일 정의:
    
    syntax = "proto3";
    package tutorial;
    
    message Person {
      string name = 1;
      int32 id = 2;
      string email = 3;
      string phone = 4;
    }
    
    
    네트워크 를 통 해 데이터 흐름 을 가 져 온 다음 proto 파일 정의 형식 으로 해석 합 니 다.
    
    Request request = new Request.Builder().url(url).build();
    Call call = okHttpClient.newCall(request);
    Response response = call.execute();
    
    if (response.isSuccessful()) {
      ResponseBody responseBody = response.body();
      if (responseBody != null) {
        return Person.parseFrom(responseBody.byteStream());
      }
    }
    
    Person 실체 클래스 가 있 으 면 인터페이스 에서 표시 할 수 있 습 니 다.
    
    textView.setText(person.toString());
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기