一、ProtoBuf编译出jar文件
1. 从http://maven.apache.org/download.cgi下载apache-maven-3.3.9-bin.zip,解压至D:\AndroidDevelop目录。
配置环境变量:
MAVEN_HOME:D:\AndroidDevelop\apache-maven-3.3.9;
Path=%MAVEN_HOME%bin;
2.从https://github.com/google/protobuf/releases下载protobuf-Java-3.1.0.zip,protoc-3.1.0-win32.zip。
将protobuf-java-3.1.0.zip解压至D:\AndroidDevelop目录,将protoc-3.1.0-win32.zip中的protoc.exe解压至D:\AndroidDevelop\protobuf-3.1.0\src目录,并复制到D:\AndroidDevelop\protobuf-3.1.0\java目录官方例子:addressbook.proto
- // [START declaration]
- syntax = "proto3";
- package tutorial;
- // [END declaration]
- // [START java_declaration]
- option java_package = "com.example.tutorial";
- option java_outer_classname = "AddressBookProtos";
- // [END java_declaration]
- // [START csharp_declaration]
- option csharp_namespace = "Google.Protobuf.Examples.AddressBook";
- // [END csharp_declaration]
- // [START messages]
- message Person {
- string name = 1;
- int32 id = 2; // Unique ID number for this person.
- string email = 3;
- enum PhoneType {
- MOBILE = 0;
- HOME = 1;
- WORK = 2;
- }
- message PhoneNumber {
- string number = 1;
- PhoneType type = 2;
- }
- repeated PhoneNumber phones = 4;
- }
- // Our address book file is just one of these.
- message AddressBook {
- repeated Person people = 1;
- }
proto3 optional不需要了
只保留repeated标记数组类型, optional和required都被去掉了
-把addressbook.proto拷贝到D:\AndroidDevelop\protobuf-3.1.0\src下
在当前目录下生成.Java文件:protoc --java_out=./Java addressbook.proto (addressbook.java 在子目录下com.example.tutorial)
在指定目录生成.java文件:protoc ./addressbook.proto --java_out=D:/java/
把addressbook.java复制到复制到工程src下
二、生成java、oc、.net相关源文件命令:
protoc --java_out=./Javalottery_history.protoprotoc --objc_out=./objc lottery_history.proto
protoc --csharp_out=./csharp lottery_history.proto
- package com.example.tutorial;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.List;
- import com.example.tutorial.AddressBookProtos.AddressBook;
- import com.example.tutorial.AddressBookProtos.Person;
- import com.example.tutorial.AddressBookProtos.Person.Builder;
- import com.example.tutorial.AddressBookProtos.Person.PhoneNumber;
- import com.example.tutorial.AddressBookProtos.Person.PhoneType;
- import com.google.protobuf.InvalidProtocolBufferException;
- /**
- * protoc --java_out=./java addressbook.proto
- * protoc ./addressbook.proto --java_out=./java/
- *
- * @author Administrator
- *
- */
- public class Test {
- public static void main(String[] args) {
- // 序列化
- Builder builder = Person.newBuilder();
- builder.setName("xxx");
- builder.setId(1);
- builder.setEmail("11@qq.com");
- builder.addPhones(PhoneNumber.newBuilder().setNumber("8713921").setType(PhoneType.HOME));
- builder.addPhones(PhoneNumber.newBuilder().setNumber("1344444444").setType(PhoneType.MOBILE));
- Person person = builder.build();
- byte[] buf = person.toByteArray();
- // 反序列化
- try {
- Person person2 = Person.parseFrom(buf);
- System.out.println(
- "编号:" + person2.getId() + "," + "邮箱:" + person2.getEmail() + "," + "姓名:" + person2.getName());
- System.out.println("PhonesCount:" + person2.getPhonesCount());
- List<PhoneNumber> phonesList = person2.getPhonesList();
- for (int i = 0; i < phonesList.size(); i++) {
- PhoneNumber phoneNumber = phonesList.get(i);
- String str = "";
- switch (phoneNumber.getType()) {
- case HOME:
- str = "家庭电话:";
- break;
- case MOBILE:
- str = "手机号:";
- break;
- case WORK:
- str = "工作电话:";
- break;
- case UNRECOGNIZED:
- break;
- default:
- break;
- }
- System.out.println(str + phonesList.get(i).getNumber());
- }
- } catch (InvalidProtocolBufferException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // ============================
- com.example.tutorial.AddressBookProtos.AddressBook.Builder builder2 = AddressBook.newBuilder();
- builder2.addPeople(person);
- AddressBook addressBook = builder2.build();
- byte[] addressBookbs = addressBook.toByteArray();
- try {
- AddressBook addressBook2 = addressBook.parseFrom(addressBookbs);
- List<Person> peopleList = addressBook2.getPeopleList();
- } catch (InvalidProtocolBufferException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // ===========================
- FileInputStream fs = null;
- FileOutputStream fo = null;
- try {
- fo = new FileOutputStream("D:\\test3");
- fo.write(buf);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- try {
- fo.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- try {
- fs = new FileInputStream("D:\\test3");
- Person person2 = Person.parseFrom(fs);
- System.out.println("ok" + person2.getName() + ", " + person2.getEmail());
- List<PhoneNumber> lstPhones = person2.getPhonesList();
- for (PhoneNumber phoneNumber : lstPhones) {
- System.out.println("ok:" + phoneNumber.getNumber());
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }