日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Protocol Buffer入门——轻松搭建java环境 .

發布時間:2024/4/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Protocol Buffer入门——轻松搭建java环境 . 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/xyz317100759/article/details/6261236

1185人閱讀 評論(5) 收藏 舉報

????? 由于項目的關系,前不久學習了Protocol Buffer。剛開始的時候,有些迷茫,網上的資料大多是介紹C++語言環境下的,或者是不太完整的java環境的介紹。后來只好去官網看官方的文檔,通過文檔一步一步學習,終于有了一些進展。為使初學者少走彎路,特此分享自己的經歷。

Ps:為準確理解資料的含義,建議閱讀官方文檔,在此也給個地址http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/overview.html,好了,進入主題吧!

?

?


?

?

protobuf介紹?


????

按照官網的描述:protobuf是google提供的一個開源序列化框架。主要應用于通信協議,數據存儲中的結構化數據的序列化。它類似于XML,JSON這樣的數據表示語言,其最大的特點是基于二進制,因此比傳統的XML表示高效短小得多。雖然是二進制數據格式,但并沒有因此變得復雜,開發人員通過按照一定的語法定義結構化的消息格式,然后送給命令行工具,工具將自動生成相關的類,可以支持java、c++、python等語言環境。通過將這些類包含在項目中,可以很輕松的調用相關方法來完成業務消息的序列化與反序列化工作。


?


protobuf的優勢

?


?

1、語言中立

2、平臺中立

3、高效性


protobuf入門(eclipse下java環境的搭建)

?


?

????? 更多案例請查閱源代碼包protobuf-2.3.0.zip?里面有關于各種支持語言(java,C++,python等)的案例。

1、下載jar包 protobuf-java-2.3.0.jar

2、下載編譯器protoc.exe

3、新建java工程test_protobuf

4、導入protobuf-java-2.3.0.jar包

5、導入編譯器protoc.exe到項目下

6、在項目下建存放文件.proto的文件夾proto

7、編寫message并放在proto文件夾下,有關編寫規范和說明請參考官網文檔,在這里我引用官網的例子,創建addressbook.proto代碼如下:

[java] view plaincopyprint?
  • package?tutorial;??
  • option?java_package?=?"com.example.tutorial";??
  • option?java_outer_classname?=?"AddressBookProtos";??
  • message?Person?{??
  • ??required?string?name?=?1;??
  • ??required?int32?id?=?2;????????//?Unique?ID?number?for?this?person. ??
  • ??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;??
  • }??
  • //?Our?address?book?file?is?just?one?of?these. ??
  • message?AddressBook?{??
  • ??repeated?Person?person?=?1;??
  • }??
  • package tutorial; option java_package = "com.example.tutorial"; option java_outer_classname = "AddressBookProtos"; message Person {required string name = 1;required int32 id = 2; // Unique ID number for this person.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; } // Our address book file is just one of these. message AddressBook {repeated Person person = 1; }

    8、編譯addressbook.proto成指定的java類

    ??? 命令行下進入編譯器所在目錄,執行如下命令

    ?????protoc -I=proto/ --java_out=src proto/addressbook.proto

    ???? 其中,src為生成的java類的目標位置,這里我們選擇項目的默認包,proto/addressbook.proto表示我們的proto文件,運行后即生成java類,生成的java類被放在了package com.example.tutorial中。剛才我們指定的目標位置是src,為什么現在卻被放在了這個包中呢?這和我們的addressbook.proto文件中的option java_package = "com.example.tutorial";有關。欲了解更多,參考上節提到的官方文檔。

    9、現在有了生成的AddressBookProtos.java類,我們可以向文件里寫入消息了,首先編寫AddPerson.java,代碼如下:

    [java] view plaincopyprint?
  • import?com.example.tutorial.AddressBookProtos.AddressBook;??
  • import?com.example.tutorial.AddressBookProtos.Person;???
  • import?java.io.BufferedReader;??
  • import?java.io.FileInputStream;??
  • import?java.io.FileNotFoundException;??
  • import?java.io.FileOutputStream;???
  • import?java.io.InputStreamReader;????
  • import?java.io.IOException;????
  • import?java.io.PrintStream;??????
  • class?AddPerson{??????
  • ????//?This?function?fills?in?a?Person?message?based?on?user?input.???? ??
  • ????static?Person?PromptForAddress(BufferedReader?stdin,PrintStream?stdout)throws?IOException{????????
  • ????????Person.Builder?person?=?Person.newBuilder();??
  • ????????stdout.print("Enter?person?ID:?");????????
  • ????????person.setId(Integer.valueOf(stdin.readLine()));??????????
  • ????????stdout.print("Enter?name:?");????????
  • ????????person.setName(stdin.readLine());??????????
  • ????????stdout.print("Enter?email?address?(blank?for?none):?");????????
  • ????????String?email?=?stdin.readLine();????????
  • ????????if?(email.length()?>?0){??????????
  • ????????????person.setEmail(email);???????
  • ????????}?????????
  • ????????while?(true){??????????
  • ????????????stdout.print("Enter?a?phone?number?(or?leave?blank?to?finish):?");??
  • ????????????String?number?=?stdin.readLine();??????????
  • ????????????if?(number.length()?==?0){????????????
  • ????????????????break;??????????
  • ????????????}????????????
  • ????????????Person.PhoneNumber.Builder?phoneNumber?=?Person.PhoneNumber.newBuilder().setNumber(number);??
  • ????????????stdout.print("Is?this?a?mobile,?home,?or?work?phone??");??????????
  • ????????????String?type?=?stdin.readLine();??????????
  • ????????????if?(type.equals("mobile")){????????????
  • ????????????????phoneNumber.setType(Person.PhoneType.MOBILE);??????
  • ????????????}?else?if?(type.equals("home"))?{????????????
  • ????????????????phoneNumber.setType(Person.PhoneType.HOME);??????????
  • ????????????}?else?if?(type.equals("work"))?{???????????
  • ????????????????phoneNumber.setType(Person.PhoneType.WORK);??????????
  • ????????????}?else?{????????????
  • ????????????????stdout.println("Unknown?phone?type.??Using?default.");??????????
  • ????????????}????????????
  • ????????????person.addPhone(phoneNumber);????????
  • ????????}??????????
  • ????????return?person.build();??????
  • ????}????????
  • ????//?Main?function:?Reads?the?entire?address?book?from?a?file,??adds?one?person?based?on?user?input,? ??
  • ????//then?writes?it?back?out?to?the?same?file.???? ??
  • ????public?static?void?main(String[]?args)?throws?Exception{????????
  • ????????if?(args.length?!=?1)?{??????????
  • ????????????System.err.println("Usage:??AddPerson?ADDRESS_BOOK_FILE");??????????
  • ????????????System.exit(-1);????????
  • ????????}??????????
  • ????????AddressBook.Builder?addressBook?=?AddressBook.newBuilder();??????????
  • ????????//?Read?the?existing?address?book.?????? ??
  • ????????try?{??????????
  • ????????????addressBook.mergeFrom(new?FileInputStream(args[0]));????????
  • ????????}?catch?(FileNotFoundException?e)?{??????????
  • ????????????System.out.println(args[0]?+?":?File?not?found.??Creating?a?new?file.");????????
  • ????????}??????????
  • ????????//?Add?an?address.?????? ??
  • ????????addressBook.addPerson(??????????
  • ????????????PromptForAddress(new?BufferedReader(new?InputStreamReader(System.in)),?System.out));??????????
  • ????????//?Write?the?new?address?book?back?to?disk.?????? ??
  • ????????FileOutputStream?output?=?new?FileOutputStream(args[0]);????????
  • ????????addressBook.build().writeTo(output);???????
  • ????????output.close();??????
  • ????}???
  • }??
  • import com.example.tutorial.AddressBookProtos.AddressBook; import com.example.tutorial.AddressBookProtos.Person; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.IOException; import java.io.PrintStream; class AddPerson{ // This function fills in a Person message based on user input. static Person PromptForAddress(BufferedReader stdin,PrintStream stdout)throws IOException{ Person.Builder person = Person.newBuilder();stdout.print("Enter person ID: "); person.setId(Integer.valueOf(stdin.readLine())); stdout.print("Enter name: "); person.setName(stdin.readLine()); stdout.print("Enter email address (blank for none): "); String email = stdin.readLine(); if (email.length() > 0){ person.setEmail(email); } while (true){ stdout.print("Enter a phone number (or leave blank to finish): ");String number = stdin.readLine(); if (number.length() == 0){ break; } Person.PhoneNumber.Builder phoneNumber = Person.PhoneNumber.newBuilder().setNumber(number);stdout.print("Is this a mobile, home, or work phone? "); String type = stdin.readLine(); if (type.equals("mobile")){ phoneNumber.setType(Person.PhoneType.MOBILE); } else if (type.equals("home")) { phoneNumber.setType(Person.PhoneType.HOME); } else if (type.equals("work")) { phoneNumber.setType(Person.PhoneType.WORK); } else { stdout.println("Unknown phone type. Using default."); } person.addPhone(phoneNumber); } return person.build(); } // Main function: Reads the entire address book from a file, adds one person based on user input, //then writes it back out to the same file. public static void main(String[] args) throws Exception{ if (args.length != 1) { System.err.println("Usage: AddPerson ADDRESS_BOOK_FILE"); System.exit(-1); } AddressBook.Builder addressBook = AddressBook.newBuilder(); // Read the existing address book. try { addressBook.mergeFrom(new FileInputStream(args[0])); } catch (FileNotFoundException e) { System.out.println(args[0] + ": File not found. Creating a new file."); } // Add an address. addressBook.addPerson( PromptForAddress(new BufferedReader(new InputStreamReader(System.in)), System.out)); // Write the new address book back to disk. FileOutputStream output = new FileOutputStream(args[0]); addressBook.build().writeTo(output); output.close(); } }

    首先配置參數,也就是消息被序列化后存儲的文件名,這里,我們就把參數設置成AddressBook.代碼中提到,運行時如果文件不存在,將會創建文件并寫入;如果存在,就寫入。運行程序,按照提示輸入消息。然后查看我們的項目路徑下,將會產生AddressBook文件

    10、上一步是將消息序列化到文件中,這一步將文件中的消息反序列化,類似地,我們創建一個類:ListPeople.java 代碼如下:

    [java] view plaincopyprint?
  • import?com.example.tutorial.AddressBookProtos.AddressBook;??
  • import?com.example.tutorial.AddressBookProtos.Person;??
  • import?java.io.FileInputStream;????????
  • ????public?class?ListPeople?{??????
  • ????????//?Iterates?though?all?people?in?the?AddressBook?and?prints?info?about?them.???? ??
  • ????????static?void?Print(AddressBook?addressBook)?{????????
  • ????????????for?(Person?person:?addressBook.getPersonList())?{??????????
  • ????????????????System.out.println("Person?ID:?"?+?person.getId());??????????
  • ????????????????System.out.println("??Name:?"?+?person.getName());??????????
  • ????????????????if?(person.hasEmail())?{????????????
  • ????????????????????System.out.println("??E-mail?address:?"?+?person.getEmail());??????????
  • ????????????????}????????????
  • ????????????????for?(Person.PhoneNumber?phoneNumber?:?person.getPhoneList())?{????????????
  • ????????????????????switch?(phoneNumber.getType())?{??????????????
  • ????????????????????????case?MOBILE:????????????????
  • ????????????????????????????System.out.print("??Mobile?phone?#:?");????????????????
  • ????????????????????????????break;??????????????
  • ????????????????????????case?HOME:????????????????
  • ????????????????????????????System.out.print("??Home?phone?#:?");????????????????
  • ????????????????????????????break;??????????????
  • ????????????????????????case?WORK:????????????????
  • ????????????????????????????System.out.print("??Work?phone?#:?");????????????????
  • ????????????????????????break;????????????
  • ????????????????????}????????????
  • ????????????????????System.out.println(phoneNumber.getNumber());??????????
  • ????????????????}????????
  • ????????????}??????
  • ????????}????????
  • ????????//?Main?function:??Reads?the?entire?address?book?from?a?file?and?prints?all??the?information?inside.???? ??
  • ????????/**?
  • ?????????*?@param?args?
  • ?????????*?@throws?Exception?
  • ?????????*/??
  • ????????public?static?void?main(String[]?args)?throws?Exception?{????????
  • ????????????if?(args.length?!=?1)?{??????????
  • ????????????????System.err.println("Usage:??ListPeople?ADDRESS_BOOK_FILE");??????????
  • ????????????????System.exit(-1);????????
  • ????????????}??????????
  • ????????????//?Read?the?existing?address?book.?????? ??
  • ????????????AddressBook?addressBook?=?AddressBook.parseFrom(new?FileInputStream(args[0]));??
  • ????????????Print(addressBook);??????
  • ????????}????
  • }??
  • import com.example.tutorial.AddressBookProtos.AddressBook; import com.example.tutorial.AddressBookProtos.Person; import java.io.FileInputStream; public class ListPeople { // Iterates though all people in the AddressBook and prints info about them. static void Print(AddressBook addressBook) { for (Person person: addressBook.getPersonList()) { System.out.println("Person ID: " + person.getId()); System.out.println(" Name: " + person.getName()); if (person.hasEmail()) { System.out.println(" E-mail address: " + person.getEmail()); } for (Person.PhoneNumber phoneNumber : person.getPhoneList()) { switch (phoneNumber.getType()) { case MOBILE: System.out.print(" Mobile phone #: "); break; case HOME: System.out.print(" Home phone #: "); break; case WORK: System.out.print(" Work phone #: "); break; } System.out.println(phoneNumber.getNumber()); } } } // Main function: Reads the entire address book from a file and prints all the information inside. /*** @param args* @throws Exception*/public static void main(String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: ListPeople ADDRESS_BOOK_FILE"); System.exit(-1); } // Read the existing address book. AddressBook addressBook = AddressBook.parseFrom(new FileInputStream(args[0]));Print(addressBook); } }

    運行程序,將會看到我們輸入的消息體被遍歷并打印出來了!

    通過一個簡單的例子,希望能夠對大家有所幫助!!

    ?

    總結

    以上是生活随笔為你收集整理的Protocol Buffer入门——轻松搭建java环境 .的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。