자바/android 에서 Protocol Buffers 를 사용 하여 데 이 터 를 전송 합 니 다.

15375 단어 Android
  • 자바 안 드 로 이 드 에서 Protocol Buffers 를 사용 하여 데 이 터 를 전송 합 니 다.
  • 다운로드 프로 토 콜 버퍼
  • Proto 파일 작성
  • 매개 변수 성명
  • 매개 변수 유형
  • 보충 설명
  • 최종 proto 파일
  • 자바 파일 생 성
  • 분석 데이터
  • GIF 시연

  • 자바/android 에서 Protocol Buffers 를 사용 하여 데 이 터 를 전송 합 니 다.
    Protocol Buffers 는 데이터 인 터 랙 션 형식 으로 Google 회사 가 오픈 한 데이터 기술 언어 로 구조 화 된 데 이 터 를 직렬 화 할 수 있 으 며 데이터 저장, 통신 프로 토 콜 등에 사용 할 수 있 습 니 다.현재 유행 하 는 XML 및 JSon 형식 으로 데 이 터 를 저장 하 는 것 보다 Protocol Buffers 를 통 해 정 의 된 파일 의 부피 가 더 작고 해석 속도 가 빠르다 (공식 문서 에서 명확 하 게 언급). 현재 많은 주류 언어 를 지원 하고 있 으 며, 이 글 은 자바/안 드 로 이 드 에서 어떻게 사용 하 는 지 를 소개 한다.
    Github 주소
    공식 주소
    프로 토 콜 버퍼 다운로드
    공식 주소 나 maven 창고 에서 다운로드 하면 됩 니 다.
    프로 토 콜 파일 작성
    본 고 는 공식 문서 의 예 를 들 어 보 여 줍 니 다. 공식 문서 의 예 주소 proto 파일 에서 Message 는 자바 와 유사 합 니 다. 그 중에서 우리 가 필요 로 하 는 속성 을 정의 할 수 있 습 니 다.
    message Person {
      required string name = 1;
      required int32 id = 2;
      optional string email = 3;
    
      enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
      }
    
      message PhoneNumber {
        required string number = 1;
        optional PhoneType type = 2 [default = HOME];
      }
    
      repeated PhoneNumber phone = 4;
    }

    위의 공식 예 를 통 해 우 리 는 Protocol Buffers 가 매 거 진 것 을 지지 한 다 는 것 을 알 수 있다.
    매개 변수 선언
    You specify that message fields are one of the following:
    
        required: a well-formed message must have exactly one of this field.
        optional: a well-formed message can have zero or one of this field (but not more than one).
        repeated: this field can be repeated any number of times (including zero) in a well-formed message. The order of the repeated values will be preserved.
    
  • required: 하나의 message 에 필드 가 있어 야 합 니 다.
  • optional: 하나의 message 에서 선택 할 수 있 는 것: 하나 도 있 고 0 개 도 있 습 니 다.
  • repeated: 하나의 message 에서 임 의 반복 (0 포함) 을 할 수 있 지만 순 서 를 유지 합 니 다.
    자바 의 집합 으로 이해 할 수 있 습 니 다.

  • 매개 변수 유형
    다음은 공식 문서 에서 proto 형식의 파일 에 있 는 매개 변수 형식 을 정의 하고 다른 언어 에 있 는 데이터 형식 과 대응 하 는 관계 입 니 다.
    proto Type
    C++ Type
    Java Type
    Python Type[2]
    Go Type
    double
    double
    double
    float
    *float64
    float
    float
    float
    float
    *float32
    int32
    int32
    int
    int
    *int32
    int64
    int64
    long
    int/long[3]
    *int64
    uint32
    uint32
    int[1]
    int/long[3]
    *uint32
    uint64
    uint64
    long[1]
    int/long[3]
    *uint64
    sint32
    int32
    int
    int
    *int32
    sint64
    int64
    long
    int/long[3]
    *int64
    fixed32
    uint32
    int[1]
    int
    *uint32
    fixed64
    uint64
    long[1]
    int/long[3]
    *uint64
    sfixed32
    int32
    int
    int
    *int32
    sfixed64
    int64
    long
    int/long[3]
    *int64
    bool
    bool
    boolean
    bool
    *bool
    string
    string
    String
    str/unicode[4]
    *string
    bytes
    string
    ByteString
    str
    []byte
    추가 설명:
  • . proto 파일 에서 여러 message 형식 을 정의 할 수 있 습 니 다.이것 은 여러 개의 관련 정 보 를 정의 할 때 매우 유용 합 니 다. 예 를 들 어 Search Response 메시지 형식 에 해당 하 는 답장 메시지 형식 을 정의 하려 면 같은. proto:
  • 에 추가 할 수 있 습 니 다.
    message SearchRequest {
      required string query = 1;
      optional int32 page_number = 2;
      optional int32 result_per_page = 3;
    }
    message SearchResponse {
     ...
    }
  • 주석 추가://후 관련 주석 추가
  • To add comments to your .proto files, use C/C++-style // syntax.
    message SearchRequest {
      required string query = 1;
      optional int32 page_number = 2;// Which page number do we want?
      optional int32 result_per_page = 3;// Number of results to return per page.
    }

    최종 proto 파일
    여기 서 공식 문서 의 예 를 선택 합 니 다. 우 리 는 이 를 약간 바 꾸 고 가방 이름과 생 성 된 유형 을 우리 자신의 것 으로 바 꿉 니 다.
    // See README.txt for information and build instructions.
    //
    // Note: START and END tags are used in comments to define sections used in
    // tutorials.  They are not part of the syntax for Protocol Buffers.
    //
    // To get an in-depth walkthrough of this file and the related examples, see:
    // https://developers.google.com/protocol-buffers/docs/tutorials
    
    // [START declaration]
    syntax = "proto3";
    package lhy;
    // [END declaration]
    
    // [START java_declaration]
    option java_package = "com.csdn.lhy";   //    Java     
    option java_outer_classname = "PersonInfo"; //     Java     
    // [END java_declaration]
    
    // [START csharp_declaration]
    option csharp_namespace = "Google.Protobuf.Examples.AddressBook";
    // [END csharp_declaration]
    
    // [START messages]
    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;
    }
    
    // Our address book file is just one of these.
    message AddressBook {
      repeated Person people = 1;
    }
    // [END messages]
    

    자바 파일 생 성
    방금 다운로드 한 exe 도 구 를 통 해 해당 하 는 파일 을 생 성 해 야 합 니 다: 명령 행: proto.exe --java_out=./ ./addressbook.proto우 리 는 지정 한 가방 의 파일 에서 우리 가 방금 지정 한 자바 클래스 를 생 성 하 는 것 을 볼 수 있 습 니 다.
    여기 서 설명 하고 자 하 는 것 은 addressbook.proto 이것 이 바로 우리 가 방금 정의 한 proto 파일 이다.
    분석 데이터
    우 리 는 방금 내 린 jar 패키지 와 생 성 된 자바 파일 을 우리 프로젝트 에 복사 해 야 합 니 다. 실제 프로젝트 에서 우 리 는 보통 흐름 을 통 해 데 이 터 를 받 아들 이 고 보 내 며 생 성 된 자바 파일 에서 처리 해 주 었 습 니 다.
  • toByteArray() :
    이 대상 을 하나의 Byte 배열 로 정렬 하여 흐름 으로 포장 할 수 있다.
  • parseFrom() :
    byte 데이터 나 스 트림 에서 자바 류 의 대상 을 분석 할 수 있 습 니 다.

  • 예제 코드:
    package com.csdn.lhy.protobuffersdemo;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    
    import static com.csdn.lhy.protobuffersdemo.PersonInfo.Person.PhoneType.HOME;
    
    public class MainActivity extends AppCompatActivity{
    
        private PersonInfo.Person lhy;
        private Button serialize;
        private Button deserialize;
        private TextView tv_info;
    
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
    
        }
    
        private void initView(){
            serialize = (Button) findViewById(R.id.serialize);
            deserialize = (Button) findViewById(R.id.deserialize);
            tv_info = (TextView) findViewById(R.id.tv_info);
            serialize.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    serializePerson();
                }
            });
    
            deserialize.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    deserializePerson();
                }
            });
        }
    
        private void deserializePerson(){
            try{
                PersonInfo.Person dese_lhy = PersonInfo.Person.parseFrom(new ByteArrayInputStream(lhy.toByteArray()));
                StringBuffer sb = new StringBuffer();
                String newLine = "
    "
    ; sb.append("Name: "+dese_lhy.getName()); sb.append(newLine); sb.append("Id: "+ dese_lhy.getId()); sb.append(newLine); sb.append("Phone Num: "+ dese_lhy.getPhones(0)); sb.append(newLine); tv_info.setText(sb.toString()); }catch(IOException e){ e.printStackTrace(); } } private void serializePerson(){ // Person lhy = PersonInfo.Person.newBuilder() .setName("Lhy") .setId(110) .setEmail("Vive la Janee D'Arc") .addPhones(PersonInfo.Person.PhoneNumber.newBuilder() .setNumber("120") .setType(HOME).build()) .build(); } }

    데모 GIF

    좋은 웹페이지 즐겨찾기