首頁 > 軟體

Ubuntu 14.04下ProtoBuf環境搭建及序列化範例

2020-06-16 17:18:19

編譯安裝

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


IT145.com E-mail:sddin#qq.com