Reference
Example
Install protobuf
- Download from Git: https://github.com/protocolbuffers/protobuf
- Install protobuf
- Setup protobuf folder to PATH
- 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); } } }
沒有留言:
張貼留言