2021-05-12 14:32:11
Ubuntu 14.04下ProtoBuf環境搭建及序列化範例
編譯安裝
protobuf是google開源的一個序列化方案,根據google的benchmarking測試,各個方面的表現都非常不錯。詳細的可以參考下面的基準測試專案:https://github.com/eishay/jvm-serializers/wiki
protobuf的使用很簡單,但是,google被牆了,造成下載和搭建環境比較麻煩。我這裡就來一個完整的處理過程,搭建按照這個步驟就能夠簡單的體驗protobuf了。我本機的環境是Ubuntu 14。可以參考。
下載原始碼
首先,從github上下載protobuf的原始碼,github的地址:https://github.com/google/protobuf
shell>Git clone https://github.com/google/protobuf.git
編譯例外處理
現在,我們基本上可以按照github上的編譯步驟進行操作,但是,有兩點需要注意
1.我們現在是使用的原始碼構建,必須切換到合適的release版本。
git tag
git checkout v2.6.1
2.你會發現按照github上面編譯,第一步就報錯。
檢視指令碼的內容,它去下載一個google的gtest的東西,因為“眾所周知”的原因,下載失敗,造成不能生成configure檔案。這個時候,可以手動去網路上下載這個zip包,解壓,並且重新命名為gtest。就可以繼續編譯了。
我的資源中上傳了一個,大家也可以自行下載。
Linux公社資源站下載:
------------------------------------------分割線------------------------------------------
免費下載地址在 http://linux.linuxidc.com/
使用者名稱與密碼都是www.linuxidc.com
具體下載目錄在 /2017年資料/3月/27日/Ubuntu 14.04下ProtoBuf環境搭建及序列化範例/
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
------------------------------------------分割線------------------------------------------
下面給出操作步驟
unzip gtest-1.7.0.zip
mv gtest-1.7.0 gtest
./autogen.sh
編譯安裝
經過上面的操作就能生成configure檔案了。就可以按照github上面的步驟正常編譯了
./configure --prefix=/usr
make
make check
make install
這個時候編譯安裝就已經完成了。
序列化demo
搭建一個maven專案
只需要一個簡單的maven專案就行了,可以直接跳過archtype的選擇。
在pom.xml中新增如下依賴
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.6.1</version>
</dependency>
寫一個schema檔案,放置到包目錄就可以。就是官方網站上的簡單範例。
syntax="proto2";
package tutorial;
option java_package = "com.wu.protobuf";
option java_outer_classname = "AddressBookProtos";
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;
}
message AddressBook {
repeated Person person = 1;
}
然後,就可以使用protobuf的編譯器,生成對應的stub了。切換到專案的src/main/java目錄
protoc --java_out=. com/wu/addressbook.proto
eclipse中重新整理專案原始碼目錄就可以看到生成的檔案了。
然後編寫一個類進行測試。
package com.wu.protobuf;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import com.wu.protobuf.AddressBookProtos.AddressBook;
import com.wu.protobuf.AddressBookProtos.Person;
public class ProtocDemo {
public 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());
}
}
}
public void serialize() throws IOException{
//build message
Person john =
Person.newBuilder()
.setId(1234)
.setName("John Doe")
.setEmail("jdoe@example.com")
.addPhone(
Person.PhoneNumber.newBuilder()
.setNumber("555-4321")
.setType(Person.PhoneType.HOME))
.build();
AddressBook.Builder addressBook = AddressBook.newBuilder();
addressBook.addPerson(john);
//serialize to disk
FileOutputStream output = new FileOutputStream("addressbook.pbd");
addressBook.build().writeTo(output);
output.close();
}
public void deserialize() throws FileNotFoundException, IOException{
AddressBook addressBook =
AddressBook.parseFrom(new FileInputStream("addressbook.pbd"));
Print(addressBook);
}
public static void main(String[] args) throws IOException {
ProtocDemo demo=new ProtocDemo();
demo.serialize();
System.out.println("serialize to disk success!!");
System.out.println("start deserialize......");
demo.deserialize();
}
}
右鍵,執行就能看到效果了!
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-03/142242.htm
相關文章