誰もがJSONが何であるかを知っていると思います。わからない場合は本当に出ています。グーグル。ここには何も紹介しません。
誰もがProtobufferについてめったに聞いていないと思いますが、Googleによって行われた場合、誰もがそれを試すことに興味があると思います。結局のところ、Googleの輸出はほとんどが高品質の製品です。
Protobufferは、JSONに似た伝送プロトコルです。実際、それはプロトコルとは言えません。それは単なるデータ送信のものです。
それで、それとJSONの違いは何ですか?
言語間、これはその利点の1つです。コンパイラ、Protocが付属しており、コンパイルするだけで、Java、Python、およびC ++コードにコンパイルできます。当面はこれら3つだけがあるので、当面は他の人について考えないでください。そうすれば、他のコードを書くことなく直接使用できます。解析されたものでさえ、すでに彼らと一緒に来ます。 JSONはもちろん横断的ですが、この相互言語は書き込みコードに基づいています。
もっと知りたい場合は、チェックすることができます。
https://developers.google.com/protocol-buffers/docs/overview
さて、これ以上苦労せずに、Protobuffer(以下ではGPBと呼ばれる)とJSONを比較する必要がある理由を見てみましょう。
1. JSONには特定の形式があり、文字に存在するため、データの量にはまだ圧縮の余地があります。 GPBのビッグデータの量がJSONのビッグデータの量よりもはるかに小さい場合、以下の例を見ることができます。
2。JSONライブラリ間の効率の違いは非常に大きく、ジャクソンライブラリとGSONの間には約5〜10のギャップがあります(これは1回しかテストされていません。 GPBは1つだけが必要であり、いわゆる複数のライブラリに違いはありません。もちろん、この点は数字を補っているだけで、無視することができます。
話は安いです、コードを見せてください。
プログラミングの世界では、コードは常に王ですので、コードにアクセスしましょう。
コードをアップロードする前に、最初にProtobufferをダウンロードする必要があります。
https://github.com/google/protobuf
1.まず、GPBには、Protoファイルと呼ばれる同様のクラス定義を持つファイルが必要です。
学生と教師の例を見てみましょう。
次の2つのファイルがあります。Student.Proto
オプションjava_package = "com.shun";オプションjava_outer_classname = "sustentproto";メッセージ学生{必須int32 id = 1;オプションの文字列名= 2;オプションのint32年齢= 3; } </span> Teacher.Proto
"sustent.proto"をインポートします。オプションjava_package = "com.shun";オプションjava_outer_classname = "teacherproto";メッセージティーチャー{必須int32 id = 1;オプションの文字列名= 2;繰り返される学生Student_list = 3; } </span>ここで私たちはいくつかの奇妙なことに遭遇しました:
インポート、int32、繰り返し、必須、オプション、オプションなど。
1)インポートとは、他のprotoファイルをインポートすることを意味します
2)必須およびオプションは、フィールドがオプションであるかどうかを示します。これにより、フィールドに値があるかどうかがProtobufferによってどのように処理が行われるかが決まります。必要な場合はマークされていますが、処理する場合、フィールドは値を渡さない場合、エラーが報告されます。オプションがマークされている場合、値は送信されません。問題はありません。
3)繰り返し理解できると思います。つまり、繰り返されるかどうかは、Javaのリストに似ています。
4)メッセージはクラスに相当します
5)オプションは、java_packageがパッケージ名、つまりJavaコードを生成するときに使用されるパッケージ名を表すオプションを表します。 java_outer_classnameはクラス名です。このクラス名は、以下のメッセージのクラス名と同じではないことに注意してください。
他のオプションや関連する種類については、公式文書をご覧ください。
2。これらのドキュメントで、私たちは何ができますか?
上記でダウンロードしたコンパイラを覚えておいてください。それを解凍すると、protoc.exeが取得されます。もちろん、これはWindowsに基づいています。私は他のシステムをしませんでした。興味があれば、試してみることができます。
パスに追加します(追加するのは簡単かどうか、不便です)。その後、上記のファイルを介して必要なクラスファイルを生成できます。
protoc -java_out =ソースコードを保存するためのパス-Proto_Path = protoファイルへのパスProto特定ファイル
-proto_path単一のファイルではなく、プロトファイルのフォルダーパスを指定し、主にファイル検索のインポートに使用され、省略できます。
ソースコードをd:/protobuffervsjson/srcに配置する必要がある場合、私のprotoファイルはd:/protofilesに保存されます
その後、私の編集コマンドは次のとおりです。
protoc -java_out = d:/protobuffervsjson/src d:/protofiles/teacher.proto d:/protofiles/student.proto
ここの最後のファイルでは、コンパイルする必要があるすべてのファイルを指定する必要があることに注意してください。
コンパイル後、生成されたファイルが表示されます。
コードはあまり投稿されていません。あなたは個人的に見ることができます。コードには多くのビルダーがあります。私はあなたがそれが一目でビルダーモードであることを知っていると信じています。
現時点では、プロジェクトにコードを貼り付けることができます。もちろん、多くのエラーがあります。
以前にダウンロードしたソースコードを覚えていますか?それを解凍して、冷酷にならないでください。次に、SRC/Main/Java/を見つけて、そのうちの1つをプロジェクトにコピーします。もちろん、アリやメイベンをコンパイルすることもできますが、私はこれらの2つのことに慣れていないので、もう醜いことはありません。私はまだそれらをプロジェクトに直接コピーすることに慣れています。
コードエラー、ハハ、通常。何らかの理由で、Googleは私たちのためにそのようなピットを離れることを主張しています。
Protobufferディレクトリの /Javaに戻り、readme.txtを表示して、文を見つけてください。
それを見た後、私はこのコードが間違っているかのように少し奇妙になると感じています。とにかく、私はそれを実行しませんでした、そして私のコマンドは次のとおりです。
<span style = "font-size:16px;"> protoc --java_out =またはコードが配置されているprotoファイルのパス(ここに記述子のパスがあります)</span>
実行後、コードにエラーがないことがわかります。
3.次のステップは、もちろんテストです。
最初にGPB書き込みテストを実施しましょう:
パッケージcom.shun.test; java.io.fileoutputStreamをインポートします。 java.io.ioexceptionをインポートします。 java.util.arraylistをインポートします。 java.util.listをインポートします。 com.shun.studentproto.studentをインポートします。 com.shun.teacherproto.teacherをインポートします。 public class protowritetest {public static void main(string [] args)throws ioexception {desudent.builder stubuilder = dustent.newbuilder(); stubuilder.setage(25); stubuilder.setid(11); stubuilder.setname( "shun"); //リストリスト<Student> StubuilderList = new ArrayList <Student>(); stubuilderlist.add(stubuilder.build()); Teacher.Builder TeaBuilder = Teacher.NewBuilder(); teabuilder.setid(1); teabuilder.setname( "testtea"); teabuilder.addallstudentlist(stubuilderlist); // gpbをfileoutputstream fos = new fileoutputstream( "c://users//shun//desktop//test//test.protoout"); teabuilder.build()。writeto(fos); fos.close(); }} </span>ファイルを見てみましょう。予期しないことが起こらない場合は、生成されるべきでした。
それが生成された後、私たちはそれを読み返さなければなりません。
パッケージcom.shun.test; java.io.fileinputStreamをインポートします。 java.io.filenotfoundexceptionをインポートします。 java.io.ioexceptionをインポートします。 com.shun.studentproto.studentをインポートします。 com.shun.teacherproto.teacherをインポートします。 public class protoreadtest {public static void main(string [] args)throws filenotfoundexception、ioexception {teacher teacher = teacher.parsefram(new fileinputstream( "c://users//shun//desktop//test//test.protoout")); System.out.println( "Teacher ID:" + Teacher.getId() + "、name:" + Teacher.getName()); for(Student Stu:Teacher.getStudEntListList()){System.out.println( "sustent id:" + stu.getid() + "、name:" + stu.getname() + "、age:" + stu.getage()); }}}} </span> GPBによって生成されたすべてのコードが私たちのために行われているため、コードは非常に簡単です。
上記は基本的な使用法を知っています。 GPBとJSON生成ファイルサイズの違いに焦点を当てます。ここにJSONの詳細なコードは投稿しません。後で例を投稿します。興味がある場合は、ダウンロードできます。
ここでは、GSONを使用してJSONを解析します。以下は、オブジェクトをJSONに変換してファイルを書き込むコードのみです。
2つのクラスの生徒と教師の基本的な定義を書くことはありません。好きなようにしてください。コードは次のとおりです。
パッケージcom.shun.test; java.io.filewriterをインポートします。 java.io.ioexceptionをインポートします。 java.util.arraylistをインポートします。 java.util.listをインポートします。 com.google.gson.gsonをインポートします。 com.shun.studentをインポートします。 com.shun.teacherをインポートします。 public class gsonwritetest {public static void main(string [] args)throws ioexception {student stu = new sustent(); Stu.Setage(25); stu.setid(22); stu.setname( "shun");リスト<Student> Stulist = new ArrayList <Student>(); Stulist.Add(STU);教師教師=新しい教師(); Teacher.SetID(22); Teacher.setName( "shun"); Teacher.setStulist(Stulist); string result = new gson()。tojson(教師); filewriter fw = new filewriter( "c:// users // shun/desktop // test // json"); fw.write(result); fw.close(); }} </span>次に、正式に実際のテストコードを入力します。最初は、リストにオブジェクトを入れました。次に、GPBとJSONによって生成されたファイルサイズを順番にテストします。
以前のGPBコードを改善し、異なる数のリストを生成し、ファイルを再生します。
パッケージcom.shun.test; java.io.fileoutputStreamをインポートします。 java.io.ioexceptionをインポートします。 java.util.arraylistをインポートします。 java.util.listをインポートします。 com.shun.studentproto.studentをインポートします。 com.shun.teacherproto.teacherをインポートします。 public class protowritetest {public static final int size = 100; public static void main(string [] args)throws ioexception {// construction list <sudtent> stubuilderlist = new arrayList <Student>(); for(int i = 0; i <size; i ++){sustent.builder stubuilder = dustent.newbuilder(); stubuilder.setage(25); stubuilder.setid(11); stubuilder.setname( "shun"); stubuilderlist.add(stubuilder.build()); } Teacher.Builder TeaBuilder = Teacher.NewBuilder(); teabuilder.setid(1); teabuilder.setname( "testtea"); teabuilder.addallstudentlist(stubuilderlist); // gpbをfileoutputstream fos = new fileoutputStream( "c:// users // shun // desktop // test // proto-" + size); teabuilder.build()。writeto(fos); fos.close(); }} </span>ここのサイズは、上記のテスト番号に順番に変更され、次のことを取得できます。
次に、JSONテストコードを見てみましょう。
パッケージcom.shun.test; java.io.filewriterをインポートします。 java.io.ioexceptionをインポートします。 java.util.arraylistをインポートします。 java.util.listをインポートします。 com.google.gson.gsonをインポートします。 com.shun.studentをインポートします。 com.shun.teacherをインポートします。 public class gsonwritetest {public static final int size = 100; public static void main(string [] args)throws ioexception {list <susted> stulist = new ArrayList <Student>(); for(int i = 0; i <size; i ++){student stu = new Student(); Stu.Setage(25); stu.setid(22); stu.setname( "shun"); Stulist.Add(STU); }教師教師= new Teacher(); Teacher.SetID(22); Teacher.setName( "shun"); Teacher.setStulist(Stulist); string result = new gson()。tojson(教師); filewriter fw = new filewriter( "c:// users // shun // desktop // test // json" + size); fw.write(result); fw.close(); }} </span>同じ方法を使用して、サイズを変更し、対応するテストを実行します。
JSONとGPBのファイルサイズが、データボリュームが徐々に増加すると大きな違いがあることが明確にわかります。 JSONは明らかにはるかに大きいです。
上の表はより明確でなければなりません。ビッグデータのGPBは非常に支配的ですが、一般に、クライアントとサーバーはそのようなビッグデータと直接対話しません。ビッグデータは、主にサーバーの送信で発生します。ニーズに直面している場合は、毎日何百ものログファイルを別のサーバーに送信する必要があります。ここのGPBは大きな助けになるかもしれません。
深さの比較と言われていますが、主な比較はサイズであり、時間の比較はそれほど多くなく、大きな違いもありません。
記事で選択したGSONパーサーの場合、興味のある友人はジャクソンやファストジャンなどを選択できますが、生成されたファイルサイズは同じですが、解析時間は異なります。