protobuf java_ProtoBuf for java使用笔记 | 学步园
三、新建项目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使用笔记 | 学步园相关推荐
- java构造字符缓冲区_java学习笔记 | 学步园
一.数组 类型[] 名称=new 类型[长度] 二.字符串2.1字符串类Stringjava.lang.StringString 名称=new String("xxxx")=&qu ...
- java jeditorpane 自动换行_JDIC 中利用WebBrowser内置浏览器到java application中 | 学步园...
JDIC简介: JDesktop Integration Components (JDIC),是一个开源的项目,目的是构建消除本机应用程序和 Java 等价物之间差距的组件.项目组长是个中国人.该项目 ...
- java linux 串口_Linux Java 串口通信 | 学步园
费了好大的劲搞定Linux系统上用Java写串口通信的问题. jdk中没有原生的串口api,网上找了半天的资料,大概知道了:Linux系统上用Java写串口程序,有两个包比较常用,一个是当年sun官方 ...
- java ebcdic_java EBCDIC | 学步园
从网上找了一段关于用Java来转EBCDIC的代码,测试了一下是可以的. package com.util; import java.io.File; import java.io.FileInput ...
- 猴子选大王 java_猴子选大王(java求解) | 学步园
n只猴子选大王,方法如下:按照1,2,3....n给猴子编号,然后按编号顺序坐成1圈,从1号猴子开始按编号顺序报数至m,报到m的猴子退出圈外,退出的猴子的下一只猴子重新从1开始报数至m,报到m的猴子退 ...
- java remoteobject_RemoteObject使用 | 学步园
采用blazeDS 的rpc来访问java后台,而且是即时编译形式的.这里总计一下remoteObject的用法: 1,如果跨域访问,就必须指定:endpoint或channelSet:示例如下 va ...
- java jnotify_JNotify使用 | 学步园
1. 线程轮询扫描 优点:纯java实现,完美跨平台. 缺点:监听文件较多时,需要扫描的量太大:响应不是非常及时,依赖于扫描间隔时间. 2. 文件钩子 优点:事件驱动方式,无目录扫描. 缺点:跟平台相 ...
- matlab写出函数表达式,matlab 由状态空间表达式求传递函数 笔记 | 学步园
1 内容 有一个两输入两输出线性系统 ,求该系统的传递函数表达式子. 2 求解 2.1 相关函数 状态空间表达式的传递函数用ss2tf函数来求解 函数原型 [b,a] = ss2tf(A,B,C,D, ...
- 数据库decimal对应java什么类型_数据库类型和java类型对应关系 | 学步园
类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR L+N VARCHAR java.lang.String 12 CHAR N CHAR java. ...
最新文章
- map multimapc++_C++的Map和Multimap
- cognos学习轨迹
- 工作心得之-------关于“表现”
- W ndoWs7重启按F11没用,windows7无法正常启动按F8也没有效果的解决方法
- 【Linux】一步一步学Linux——ping命令(150)
- 开发 Windows 8 Bing地图应用(2)
- android歌词效果,自定义View:Android歌词控件
- 计算机命令无法到达打印机,单击打印命令时打印机无响是怎么回事
- CRC8算法的解读,以及在E2E通信保护的应用
- 输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。(指针)
- Git对G码云上项目的上传及同步
- 自娱自乐 中秋快乐 代码
- Linux系统cp:omitting directory`XXX'问题解决
- HJL-E6/A DC220V数字式【电流继电器】
- Android 客户端如何与服务器时间同步
- C语言编程学习:写的秒速计算四则混合运算项目
- c++语言表白超炫图形_几个超炫的专业词汇
- Java专题 基础篇--判断(三元表达式,switch等) +个税计算案例
- klayout 源码分析系列续 执行脚本
- android导入项目出现Originally defined here错误