ProtoBuf for java使用笔记
2013-06-14 16:50
239 查看
一、下载:protoc-2.5.0-win32.zip。解压到得protoc.exe。
二、下载:protobuf-java-2.5.0.jar。
三、新建项目ProtobufDemo。包名:com.protobufdemo.protobuf。
四、把上面的jar包跟exe放到工程目录下。新建文件夹:proto。在其下新建文件:msg.proto,内容如下:
五、生成 java文件:在proto.exe目录下:protoc --java_out=./src ./proto/msg.proto
六、测试类:ProtobufDemo.java
七、辅助类:Converter.java
Demo:点击下载。
二、下载:protobuf-java-2.5.0.jar。
三、新建项目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<PhoneNumber> 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. * <hr> * <b>© Copyright 2011 Guidebee, Inc. All Rights Reserved.</b> * * @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:点击下载。
相关文章推荐
- linux下Google的Protobuf安装及使用笔记
- Java for Web学习笔记(一零五):Spring框架中使用JPA(5)Isolation和C3P0(上)
- Google的Protobuf安装及使用笔记
- java中使用protobuf序列化(反序列化)
- java中Protobuf的使用实例
- Java for Web学习笔记(一零七):Spring框架中使用JPA(7)密码和BCrypt
- protobuf的配置原始文件.proto中,使用修饰符repeated、required、optional生成的java文件的区别
- ProtoBuf 的java使用
- google protobuf 使用过程笔记
- java序列化/反序列化之xstream、protobuf、protostuff 的比较与使用例子
- Java for Web学习笔记(二五):JSTL(1)使用JSTL
- PB使用一:用protobuf-java-2.5.0.jar把 buffFight.proto 生成 buffFight.java 的方法
- protobuf 的java使用
- 深度学习Caffe实战笔记(12)Caffe 使用Python接口No module named google.protobuf.internal修复方案
- java(Android):windows系统 ProtoBuf(3.1.0)编译及使用
- protobuf java使用
- protobuf for python 安装与使用
- java序列化/反序列化之xstream、protobuf、protostuff 的比较与使用例子
- Java for Web学习笔记(七一):Service和Repository(6)在Spring框架中使用Listener