(4.3.2.12)AndroidとJavaの軽量Wireプロトコルバッファ

23458 ワード

https://github.com/square/wire
Ireプロトコルバッファにはコードが必要です!-オマル小は私たちのチームとプロジェクトが増加したため、データの種類と数も増加しました.簡単なデータモデルを複雑に変換できました.アプリケーションがディスクまたはネットワークにデータを格納して信号を送信しても、そのデータの構造と解釈は明らかである必要があります.消費者の最高の仕事は
Wireプロトコルバッファ
「一人にコードが必要だ!」 -オマル小
デルのチームとプロジェクトが増加したため、データの種類と数も増加しました.簡単なデータモデルを複雑に変換できました.アプリケーションがディスクまたはネットワークにデータを格納して信号を送信しても、そのデータの構造と解釈は明らかである必要があります.消費者の最高の仕事、彼らが知っているデータ!
アーキテクチャの説明とドキュメントのデータモデル.データがあれば、アーキテクチャがあるはずです.
プロトコルバッファ
Googleのプロトコルバッファは、偉大なモデル言語をめぐっています.
そのプラットフォームは言語とは関係ありません.プログラミング言語を使用しても、元のアーキテクチャとアプリケーションを使用できます.
元のモードは後方互換性があり、将来に向けています.アプリケーションとして古い機能を失い、新しいアーキテクチャを開発することができます.
そのポイント.元のアーキテクチャはあなたのデータモデルを説明します.ただです.
メッセージ定義の例を次に示します.
 
  
syntax = "proto2";

package squareup.dinosaurs; option java_package = "com.squareup.dinosaurs"; import "squareup/geology/period.proto"; message Dinosaur { // Common name of this dinosaur, like "Stegosaurus". optional string name = 1; // URLs with images of this dinosaur. repeated string picture_urls = 2; optional squareup.geology.Period period = 5; }

ここでは列挙定義を示します.
 
  
syntax = "proto2";

package squareup.geology; option java_package = "com.squareup.geology"; enum Period { // 145.5 million years ago — 66.0 million years ago. CRETACEOUS = 1; // 201.3 million years ago — 145.0 million years ago. JURASSIC = 2; // 252.17 million years ago — 201.3 million years ago. TRIASSIC = 3; }

このパターン言語はProtocol Buffersの「最大の特徴」である.JSON APIを記述するなど、ドキュメントの目的のために使用することもできます.
プロトコルバッファは、モードに適合するメッセージのコンパクトなバイナリ符号化も定義する.この符号化高速符号化、高速復号化、小から伝送、および小記憶.バイナリ符号化は、5 以上のデジタルタグスレーブアーキテクチャを使用する.
例えば、この恐竜をコードします.
 
 
{
  name: "Stegosaurus",
  period: JURASSIC
}

エンコーディング値はわずか15バイトです.
 
 
Hex  Description
 0a  tag: name(1), field encoding: LENGTH_DELIMITED(2). 1 << 3 | 2
 0b  "Stegosaurus".length()
 53  'S'
 74  't'
 65  'e'
 67  'g'
 6f  'o'
 73  's'
 61  'a'
 75  'u'
 72  'r'
 75  'u'
 73  's'
 28  tag: period(5), field encoding: VARINT(0). 5 << 3 | 0
 02  JURASSIC(2)

どうしてネット?
このプロトコルバッファモード言語とバイナリ符号化は、Googleによって定義されています.Wireは広場から独立して実現され、AndroidやJava向けに設計されています.
アーキテクチャで定義された各メッセージのタイプについて、電線は可変モデルクラスとその構築者を生成します.生成されたコードは、コードを手動で作成するように見えます.記録、フォーマット、簡単です.電線のAPIは、プログラマーの有効なJavaが家で誰が好きかを感じなければならない.
それでも、いくつかの興味深い設計決定線があります.
電線メッセージは、通常のgetterメソッドではなく、 フィールドを発表した.これにより、生成されたコードとコードの実行が減少します.より少ないコードはAndroidプログラムが特に有利です.
電線が避けられた場合にマッピングします.フィールドpicture_urlsがアーキテクチャにJavaレルムを生成すると宣言  picture_urlsは、伝統的なpictureUrlsラクダの場合ではありません.名前は最初は気まずい思いをしましたが、夢のような grep以上の検索ツールを使うたびに、Javaソースコードとデータモードの間を航行すると、より多くのマッピングはありません.また、善意のアラート呼び出しコードも提供されています.元のメッセージは少し特殊です.
基本タイプは常に箱詰めです.フィールドが存在しない場合、その価値は です.これは、恐竜などの自然オプションフィールドで使用され、その周期は不明です.フィールドは空でもかまいません.モードの進化のためです.明日 ブールのメッセージ定義を追加すると、今日のデータにはフィールドの値はありません.
以下に、コンパクトに生成されたコード において上記定義されたメッセージを示す.
  Wire            //,   。
//   :squareup /  / dinosaur.proto 9:1 
package com.squareup.dinosaurs; import com.squareup.geology.Period; import com.squareup.wire.Message; import com.squareup.wire.ProtoAdapter; import com.squareup.wire.WireField; import java.util.List; import okio.ByteString; public final class Dinosaur extends Message<Dinosaur, Dinosaur.Builder> { public static final ProtoAdapter<Dinosaur> ADAPTER = ProtoAdapter.newMessageAdapter(Dinosaur.class); private static final long serialVersionUID = 0L; public static final String DEFAULT_NAME = ""; public static final Period DEFAULT_PERIOD = Period.CRETACEOUS; /**  * Common name of this dinosaur, like "Stegosaurus".  */ @WireField( tag = 1, adapter = "com.squareup.wire.ProtoAdapter#STRING" ) public final String name; /**  * URLs with images of this dinosaur.  */ @WireField( tag = 2, adapter = "com.squareup.wire.ProtoAdapter#STRING", label = WireField.Label.REPEATED ) public final List<String> picture_urls; @WireField( tag = 5, adapter = "com.squareup.geology.Period#ADAPTER" ) public final Period period; public Dinosaur(String name, List<String> picture_urls, Period period) { this(name, picture_urls, period, ByteString.EMPTY); } public Dinosaur(String name, List<String> picture_urls, Period period, ByteString unknownFields) { super(unknownFields); this.name = name; this.picture_urls = immutableCopyOf("picture_urls", picture_urls); this.period = period; } @Override public Builder newBuilder() { Builder builder = new Builder(); builder.name = name; builder.picture_urls = copyOf("picture_urls", picture_urls); builder.period = period; builder.addUnknownFields(unknownFields()); return builder; } @Override public boolean equals(Object other) { if (other == this) return true; if (!(other instanceof Dinosaur)) return false; Dinosaur o = (Dinosaur) other; return equals(unknownFields(), o.unknownFields()) && equals(name, o.name) && equals(picture_urls, o.picture_urls) && equals(period, o.period); } @Override public int hashCode() { int result = super.hashCode; if (result == 0) { result = unknownFields().hashCode(); result = result * 37 + (name != null ? name.hashCode() : 0); result = result * 37 + (picture_urls != null ? picture_urls.hashCode() : 1); result = result * 37 + (period != null ? period.hashCode() : 0); super.hashCode = result; } return result; } public static final class Builder extends com.squareup.wire