测试环境:Ubuntu 16.04 LTS
- 到protobuf的release页面
下载源码:https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-all-3.6.1.tar.gz 安装编译依赖
sudo apt-get install autoconf automake libtool curl make g++ unzip
解压、编译、安装(测试时是非root帐号,所以install时需要sudo)
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
配置1:环境变量(参考链接)
vim /etc/profile 添加两行: export PATH=$PATH:/usr/local/protobuf/bin/ export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/ source /etc/profile ~/.profile中也添加上面两行
配置2:动态链接库
cd /etc/ld.so.conf.d/ sudo vi protobuf.conf 添加一行: /usr/local/protobuf/lib ldconfig
确认版本
$ protoc --version libprotoc 3.6.1
验证(转自)
vi message.protosyntax = "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.proto
java代码验证
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)); } }
其他