ubuntu編譯安裝protobuf

測試環境:Ubuntu 16.04 LTShtml

  1. protobuf的release頁面
    下載源碼:https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-all-3.6.1.tar.gz
  2. 安裝編譯依賴java

    sudo apt-get install autoconf automake libtool curl make g++ unzip
  3. 解壓、編譯、安裝(測試時是非root賬號,因此install時須要sudo)linux

    tar -xvf protobuf-all-3.6.1.tar.gz
    cd protobuf-3.6.1
    ./configure --prefix=/usr/local/protobuf
    make
    make check
    sudo make install
  4. 配置1:環境變量(參考連接git

    vim /etc/profile
    添加兩行:
    export PATH=$PATH:/usr/local/protobuf/bin/
    export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
    
    source /etc/profile
    
    ~/.profile中也添加上面兩行
  5. 配置2:動態連接庫github

    cd /etc/ld.so.conf.d/
    sudo vi protobuf.conf
    添加一行:
    /usr/local/protobuf/lib
    
    ldconfig
  6. 確認版本vim

    $ protoc --version
    libprotoc 3.6.1
  7. 驗證(轉自
    vi message.protocurl

    syntax = "proto3";
    
    message Person {
        int32 id = 1;
        string name = 2;
    
        repeated Phone phone = 4;
    
        enum PhoneType {
            MOBILE = 0;
            HOME = 1;
            WORK = 2;
        }
    
        message Phone {
           string number = 1;
           PhoneType type = 2;
        }
    }

    protoc --java_out=./java ./proto/message.protojvm

  8. java代碼驗證

    maven引入:maven

    <dependency>
         <groupId>com.google.protobuf</groupId>
         <artifactId>protobuf-java-util</artifactId>
         <version>3.6.1</version>
     </dependency>

    gradle引入:性能

    compile 'com.google.protobuf:protobuf-java:3.6.1'

    java代碼

    import com.google.protobuf.InvalidProtocolBufferException;
    
     import java.util.Arrays;
     import java.util.List;
    
     public class App {
    
         public static void main(String[] args) {
             Message.Person.Builder personBuilder = Message.Person.newBuilder();
             personBuilder.setId(12345678);
             personBuilder.setName("Admin");
             personBuilder.addPhone(Message.Person.Phone.newBuilder().setNumber("10010").setType(Message.Person.PhoneType.MOBILE));
             personBuilder.addPhone(Message.Person.Phone.newBuilder().setNumber("10086").setType(Message.Person.PhoneType.HOME));
             personBuilder.addPhone(Message.Person.Phone.newBuilder().setNumber("10000").setType(Message.Person.PhoneType.WORK));
    
             Message.Person person = personBuilder.build();
             byte[] buff = person.toByteArray();
    
             try {
                 Message.Person personOut = Message.Person.parseFrom(buff);
                 System.out.printf("Id:%d, Name:%s\n", personOut.getId(), personOut.getName());
    
                 List<Message.Person.Phone> phoneList = personOut.getPhoneList();
    
                 for (Message.Person.Phone phone : phoneList) {
                     System.out.printf("PhoneNumber:%s (%s)\n", phone.getNumber(), phone.getType());
                 }
    
             } catch (InvalidProtocolBufferException e) {
                 e.printStackTrace();
             }
    
             System.out.println(Arrays.toString(buff));
    
         }
    
     }

其餘

  1. Google Protocol Buffer 的使用和原理
  2. 序列化性能比較
相關文章
相關標籤/搜索