자바/android 에서 Protocol Buffers 를 사용 하여 데 이 터 를 전송 합 니 다.
15375 단어 Android
자바/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.
자바 의 집합 으로 이해 할 수 있 습 니 다.
매개 변수 유형
다음은 공식 문서 에서 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
추가 설명:
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.