三、新建项目ProtobufDemo。包名:com.protobufdemo.protobuf。

四、把上面的jar包跟exe放到工程目录下。新建文件夹:proto。在其下新建文件:msg.proto,内容如下:

option java_package = "com.protobufdemo.protobuf";

option java_outer_classname = "PersonProbuf";

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 phone = 4;

message CountryInfo {

required string name = 1;

required string code = 2;

optional int32 number = 3;

}

}

message AddressBook {

repeated Person person = 1;

}

五、生成 java文件:在proto.exe目录下:protoc  --java_out=./src   ./proto/msg.proto

六、测试类:ProtobufDemo.java

package com.protobufdemo.protobuf;

import java.util.List;

import com.google.protobuf.InvalidProtocolBufferException;

import com.protobufdemo.protobuf.PersonProbuf.Person;

import com.protobufdemo.protobuf.PersonProbuf.Person.PhoneNumber;

public class ProtobufDemo {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

PersonProbuf.Person.Builder builder = PersonProbuf.Person.newBuilder();

builder.setEmail("Test@email.com");

builder.setId(1);

builder.setName("TestName");

builder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder()

.setNumber("15120051111")

.setType(PersonProbuf.Person.PhoneType.MOBILE));

builder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder()

.setNumber("18602991111")

.setType(PersonProbuf.Person.PhoneType.HOME));

Person person = builder.build();

int length =new String("Test@email.com"+"TestName"+"15120051111"+"18602991111").length();

byte[] buf = person.toByteArray();

try {

Person person2 = PersonProbuf.Person.parseFrom(buf);

System.out.println(person2.getName() + ", " + person2.getEmail());

List lstPhones = person2.getPhoneList();

for (PhoneNumber phoneNumber : lstPhones) {

System.out.println(phoneNumber.getNumber());

}

} catch (InvalidProtocolBufferException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println(Converter.getHexString(buf, buf.length));

System.out.println("压缩前长度:"+length);

System.out.println("压缩后长度:"+buf.length);

}

}

七、辅助类:Converter.java

//------------------------------------------------------------------------------

package com.protobufdemo.protobuf;

//[------------------------------ MAIN CLASS ----------------------------------]

//--------------------------------- REVISIONS ----------------------------------

//Date Name Tracking # Description

//-------- ------------------- ------------- --------------------------

//13SEP2011 James Shen Initial Creation

/**

* Convert help class.

*


* © Copyright 2011 Guidebee, Inc. All Rights Reserved.

*

* @version 1.00, 13/09/11

* @author Guidebee Pty Ltd.

*/

public class Converter {

// Hex help

private static final byte[] HEX_CHAR_TABLE = { (byte) '0', (byte) '1',

(byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6',

(byte) '7', (byte) '8', (byte) '9', (byte) 'A', (byte) 'B',

(byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F' };

// //

// --------------------------------- REVISIONS

// ------------------------------

// Date Name Tracking # Description

// --------- ------------------- ------------- ----------------------

// 13SEP2011 James Shen Initial Creation

// //

/**

* convert a byte arrary to hex string

*

* @param raw

* byte arrary

* @param len

* lenght of the arrary.

* @return hex string.

*/

public static String getHexString(byte[] raw, int len) {

byte[] hex = new byte[2 * len];

int index = 0;

int pos = 0;

for (byte b : raw) {

if (pos >= len)

break;

pos++;

int v = b & 0xFF;

hex[index++] = HEX_CHAR_TABLE[v >>> 4];

hex[index++] = HEX_CHAR_TABLE[v & 0xF];

}

return new String(hex);

}

private static byte uniteBytes(byte src0, byte src1) {

byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 }))

.byteValue();

_b0 = (byte) (_b0 << 4);

byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 }))

.byteValue();

byte ret = (byte) (_b0 | _b1);

return ret;

}

public static byte[] HexString2Bytes(String src) {

int length = src.length()/2;

byte[] ret = new byte[length];

byte[] tmp = src.getBytes();

for (int i = 0; i < length; ++i) {

ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);

}

return ret;

}

}

Demo:点击下载。

protobuf java_ProtoBuf for java使用笔记 | 学步园相关推荐

  1. java构造字符缓冲区_java学习笔记 | 学步园

    一.数组 类型[] 名称=new 类型[长度] 二.字符串2.1字符串类Stringjava.lang.StringString 名称=new String("xxxx")=&qu ...

  2. java jeditorpane 自动换行_JDIC 中利用WebBrowser内置浏览器到java application中 | 学步园...

    JDIC简介: JDesktop Integration Components (JDIC),是一个开源的项目,目的是构建消除本机应用程序和 Java 等价物之间差距的组件.项目组长是个中国人.该项目 ...

  3. java linux 串口_Linux Java 串口通信 | 学步园

    费了好大的劲搞定Linux系统上用Java写串口通信的问题. jdk中没有原生的串口api,网上找了半天的资料,大概知道了:Linux系统上用Java写串口程序,有两个包比较常用,一个是当年sun官方 ...

  4. java ebcdic_java EBCDIC | 学步园

    从网上找了一段关于用Java来转EBCDIC的代码,测试了一下是可以的. package com.util; import java.io.File; import java.io.FileInput ...

  5. 猴子选大王 java_猴子选大王(java求解) | 学步园

    n只猴子选大王,方法如下:按照1,2,3....n给猴子编号,然后按编号顺序坐成1圈,从1号猴子开始按编号顺序报数至m,报到m的猴子退出圈外,退出的猴子的下一只猴子重新从1开始报数至m,报到m的猴子退 ...

  6. java remoteobject_RemoteObject使用 | 学步园

    采用blazeDS 的rpc来访问java后台,而且是即时编译形式的.这里总计一下remoteObject的用法: 1,如果跨域访问,就必须指定:endpoint或channelSet:示例如下 va ...

  7. java jnotify_JNotify使用 | 学步园

    1. 线程轮询扫描 优点:纯java实现,完美跨平台. 缺点:监听文件较多时,需要扫描的量太大:响应不是非常及时,依赖于扫描间隔时间. 2. 文件钩子 优点:事件驱动方式,无目录扫描. 缺点:跟平台相 ...

  8. matlab写出函数表达式,matlab 由状态空间表达式求传递函数 笔记 | 学步园

    1 内容 有一个两输入两输出线性系统 ,求该系统的传递函数表达式子. 2 求解 2.1 相关函数 状态空间表达式的传递函数用ss2tf函数来求解 函数原型 [b,a] = ss2tf(A,B,C,D, ...

  9. 数据库decimal对应java什么类型_数据库类型和java类型对应关系 | 学步园

    类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR  L+N  VARCHAR  java.lang.String 12 CHAR N CHAR java. ...

最新文章

  1. map multimapc++_C++的Map和Multimap
  2. cognos学习轨迹
  3. 工作心得之-------关于“表现”
  4. W ndoWs7重启按F11没用,windows7无法正常启动按F8也没有效果的解决方法
  5. 【Linux】一步一步学Linux——ping命令(150)
  6. 开发 Windows 8 Bing地图应用(2)
  7. android歌词效果,自定义View:Android歌词控件
  8. 计算机命令无法到达打印机,单击打印命令时打印机无响是怎么回事
  9. CRC8算法的解读,以及在E2E通信保护的应用
  10. 输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。(指针)
  11. Git对G码云上项目的上传及同步
  12. 自娱自乐 中秋快乐 代码
  13. Linux系统cp:omitting directory`XXX'问题解决
  14. HJL-E6/A DC220V数字式【电流继电器】
  15. Android 客户端如何与服务器时间同步
  16. C语言编程学习:写的秒速计算四则混合运算项目
  17. c++语言表白超炫图形_几个超炫的专业词汇
  18. Java专题 基础篇--判断(三元表达式,switch等) +个税计算案例
  19. klayout 源码分析系列续 执行脚本
  20. android导入项目出现Originally defined here错误

热门文章

  1. 现代谱估计:多窗口谱重建
  2. 机器学习(三):支持向量机SVM(含代码和注释)
  3. CSDN转载别人文章的详细步骤
  4. 基于fdatool的滤波器设计(低通、带通、高通)
  5. 【Matlab】一种超简单的二维矩阵降维方法
  6. Mouse Without Borders 一套鼠标键盘控制多台电脑
  7. [云炬创业学笔记]第一章创业是什么测试8
  8. Python的第一个程序 Hello world
  9. 手撕 CNN 之 AlexNet(PyTorch 实战篇)
  10. win7下不能替换系统文件的解决办法