Google Protobuf - Basic Example

Reference

Example

Install protobuf

  1. Download from Git: https://github.com/protocolbuffers/protobuf
  2. Install protobuf
  3. Setup protobuf folder to PATH
  4. Try command: protoc

Define proto

syntax = "proto2";

package examples;

option java_package = "examples";
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 phones = 4;
}

message AddressBook {
    repeated Person people = 1;
}

Generate Java Code

Execute command: 

protoc -I /Users/liaoisaac/projects/study-practice/src/main/resources -java_out=/Users/liaoisaac/projects/study-practice/src/main/java/ /Users/liaoisaac/projects/study-practice/src/main/resources/addressbook.proto
Java code will be generated in "/Users/liaoisaac/projects/study-practice/src/main/java/"

Example with Maven Plugin

Introduce Maven

Define Maven plugin: protobuf-maven-plugin
(注意我把 output dir 改到我想要的 generated-java folder 了)



<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>shooeugenesea</groupId>
 <artifactId>study-examples</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.11</version>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>com.google.protobuf</groupId>
   <artifactId>protobuf-java</artifactId>
   <version>3.3.0</version>
  </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.7</version>
        </dependency>
    </dependencies>
 <build>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
     <source>1.8</source>
     <target>1.8</target>
    </configuration>
   </plugin>
   <plugin>
    <groupId>org.xolstice.maven.plugins</groupId>
    <artifactId>protobuf-maven-plugin</artifactId>
    <version>0.5.1</version>
    <configuration>
     <protocExecutable>/usr/local/bin/protoc</protocExecutable>
                    <outputDirectory>${basedir}/src/main/generated-java</outputDirectory>
    </configuration>
    <executions>
     <execution>
      <goals>
       <goal>compile</goal>
       <goal>test-compile</goal>
      </goals>
     </execution>
    </executions>
   </plugin>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
     <verbose>true</verbose>
     <fork>true</fork>
     <compilerVersion>1.8</compilerVersion>
    </configuration>
   </plugin>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.3</version>
    <configuration>
     <source>1.8</source>
     <target>1.8</target>
    </configuration>
   </plugin>
  </plugins>
 </build>
</project>
設定好之後執行 mvn clean package 就可以根據 proto generate 出 java code

Read Write generated objects

package examples;

import java.io.*;

public class ReadWriteProtobufMain {

    public static void main(String[] params) throws IOException {
        AddressBookProtos.Person person = AddressBookProtos.Person.newBuilder()
                .setEmail("email@com")
                .setName("myname")
                .setId(123)
                .addPhones(AddressBookProtos.Person.PhoneNumber.newBuilder()
                        .setType(AddressBookProtos.Person.PhoneType.HOME)
                        .setNumber("12345678")
                        .build())
                .build();


        try (PipedOutputStream out = new PipedOutputStream();
             PipedInputStream in = new PipedInputStream(out)) {
            System.out.println("write Person:\n" + person);
            person.writeTo(out);
            out.close();

            AddressBookProtos.Person readPerson = AddressBookProtos.Person.newBuilder().mergeFrom(in).build();
            System.out.println("read Person:\n" + readPerson);
        }

    }

}

Output


沒有留言:

張貼留言

別名演算法 Alias Method

 題目 每個伺服器支援不同的 TPM (transaction per minute) 當 request 來的時候, 系統需要馬上根據 TPM 的能力隨機找到一個適合的 server. 雖然稱為 "隨機", 但還是需要有 TPM 作為權重. 解法 別名演算法...