java(Android):windows系统 ProtoBuf(3.1.0)编译及使用

3 篇文章 0 订阅

一、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


  1. // [START declaration]  
  2. syntax = "proto3";  
  3. package tutorial;  
  4. // [END declaration]  
  5.   
  6. // [START java_declaration]  
  7. option java_package = "com.example.tutorial";  
  8. option java_outer_classname = "AddressBookProtos";  
  9. // [END java_declaration]  
  10.   
  11. // [START csharp_declaration]  
  12. option csharp_namespace = "Google.Protobuf.Examples.AddressBook";  
  13. // [END csharp_declaration]  
  14.   
  15. // [START messages]  
  16. message Person {  
  17.   string name = 1;  
  18.   int32 id = 2;  // Unique ID number for this person.  
  19.   string email = 3;  
  20.   
  21.   enum PhoneType {  
  22.     MOBILE = 0;  
  23.     HOME = 1;  
  24.     WORK = 2;  
  25.   }  
  26.   
  27.   message PhoneNumber {  
  28.     string number = 1;  
  29.     PhoneType type = 2;  
  30.   }  
  31.   
  32.   repeated PhoneNumber phones = 4;  
  33. }  
  34.   
  35. // Our address book file is just one of these.  
  36. message AddressBook {  
  37.   repeated Person people = 1;  
  38. }  

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下


3.cd到D:\AndroidDevelop\protobuf-3.1.0\java目录,执行mvn install –Dmaven.test.skip=true(不执行单元测试)或mvn install进行编译,完成后在D:\AndroidDevelop\protobuf-3.1.0\java\target目录下有个protobuf-3.1.0.jar文件(可能不在该目录下,D:\AndroidDevelop\protobuf-3.1.0下搜索protobuf-3.1.0.jar可以找到),复制到工程的jar目录中。


二、生成java、oc、.net相关源文件命令:

protoc --java_out=./Javalottery_history.proto
protoc --objc_out=./objc lottery_history.proto
protoc --csharp_out=./csharp lottery_history.proto



  1. package com.example.tutorial;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.util.List;  
  7.   
  8. import com.example.tutorial.AddressBookProtos.AddressBook;  
  9. import com.example.tutorial.AddressBookProtos.Person;  
  10. import com.example.tutorial.AddressBookProtos.Person.Builder;  
  11. import com.example.tutorial.AddressBookProtos.Person.PhoneNumber;  
  12. import com.example.tutorial.AddressBookProtos.Person.PhoneType;  
  13. import com.google.protobuf.InvalidProtocolBufferException;  
  14. /**  
  15.  * protoc --java_out=./java addressbook.proto  
  16.  * protoc ./addressbook.proto --java_out=./java/  
  17.  *   
  18.  * @author Administrator  
  19.  *  
  20.  */  
  21. public class Test {  
  22.     public static void main(String[] args) {  
  23.   
  24.         // 序列化  
  25.         Builder builder = Person.newBuilder();  
  26.         builder.setName("xxx");  
  27.         builder.setId(1);  
  28.         builder.setEmail("11@qq.com");  
  29.         builder.addPhones(PhoneNumber.newBuilder().setNumber("8713921").setType(PhoneType.HOME));  
  30.         builder.addPhones(PhoneNumber.newBuilder().setNumber("1344444444").setType(PhoneType.MOBILE));  
  31.   
  32.         Person person = builder.build();  
  33.         byte[] buf = person.toByteArray();  
  34.   
  35.         // 反序列化  
  36.         try {  
  37.             Person person2 = Person.parseFrom(buf);  
  38.             System.out.println(  
  39.                     "编号:" + person2.getId() + "," + "邮箱:" + person2.getEmail() + "," + "姓名:" + person2.getName());  
  40.             System.out.println("PhonesCount:" + person2.getPhonesCount());  
  41.             List<PhoneNumber> phonesList = person2.getPhonesList();  
  42.             for (int i = 0; i < phonesList.size(); i++) {  
  43.                 PhoneNumber phoneNumber = phonesList.get(i);  
  44.   
  45.                 String str = "";  
  46.                 switch (phoneNumber.getType()) {  
  47.                 case HOME:  
  48.                     str = "家庭电话:";  
  49.                     break;  
  50.                 case MOBILE:  
  51.                     str = "手机号:";  
  52.                     break;  
  53.                 case WORK:  
  54.                     str = "工作电话:";  
  55.                     break;  
  56.                 case UNRECOGNIZED:  
  57.                     break;  
  58.                 default:  
  59.                     break;  
  60.                 }  
  61.                 System.out.println(str + phonesList.get(i).getNumber());  
  62.             }  
  63.         } catch (InvalidProtocolBufferException e) {  
  64.             // TODO Auto-generated catch block  
  65.             e.printStackTrace();  
  66.         }  
  67.   
  68.         // ============================  
  69.         com.example.tutorial.AddressBookProtos.AddressBook.Builder builder2 = AddressBook.newBuilder();  
  70.         builder2.addPeople(person);  
  71.         AddressBook addressBook = builder2.build();  
  72.         byte[] addressBookbs = addressBook.toByteArray();  
  73.   
  74.         try {  
  75.             AddressBook addressBook2 = addressBook.parseFrom(addressBookbs);  
  76.             List<Person> peopleList = addressBook2.getPeopleList();  
  77.   
  78.         } catch (InvalidProtocolBufferException e) {  
  79.             // TODO Auto-generated catch block  
  80.             e.printStackTrace();  
  81.         }  
  82.         // ===========================  
  83.         FileInputStream fs = null;  
  84.         FileOutputStream fo = null;  
  85.         try {  
  86.             fo = new FileOutputStream("D:\\test3");  
  87.             fo.write(buf);  
  88.         } catch (IOException e) {  
  89.             // TODO Auto-generated catch block  
  90.             e.printStackTrace();  
  91.         } finally {  
  92.             try {  
  93.                 fo.close();  
  94.             } catch (IOException e) {  
  95.                 // TODO Auto-generated catch block  
  96.                 e.printStackTrace();  
  97.             }  
  98.         }  
  99.   
  100.         try {  
  101.             fs = new FileInputStream("D:\\test3");  
  102.             Person person2 = Person.parseFrom(fs);  
  103.             System.out.println("ok" + person2.getName() + ", " + person2.getEmail());  
  104.             List<PhoneNumber> lstPhones = person2.getPhonesList();  
  105.             for (PhoneNumber phoneNumber : lstPhones) {  
  106.                 System.out.println("ok:" + phoneNumber.getNumber());  
  107.             }  
  108.         } catch (IOException e) {  
  109.             // TODO Auto-generated catch block  
  110.             e.printStackTrace();  
  111.         }  
  112.   
  113.     }  
  114. }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值