4、protobuf简单教程
4.1、快速入门:
下载.exe编译器——编写.proto文件——利用编译器编译.proto文件生成javabean——引用jar包——直接使用javabean自带的序列化、反序列化方法
1、下载针对java的.exe编译器
protobuf编译器官方下载地址:https://developers.google.com/protocol-buffers/docs/downloads
下载不了的:点我
2、编写.proto文件
package tutorial; option java_package = "com.zjm.www.po"; option java_outer_classname = "Products2"; message Products22 { required string s1 = 1; required string s2 = 2; required string s3 = 3; required string s4 = 4; required string s5 = 5; required string s6 = 6; required string s7 = 7; required string s8 = 8; required string s9 = 9; required int32 i10 = 10; required int32 i11 = 11; required int32 i12 = 12; required int32 i13 = 13; required int32 i14 = 14; required int32 i15 = 15; required int32 i16 = 16; required int32 i17 = 17; required int32 i18 = 18; required bool b19 = 19; required bool b20 = 20; required bool b21 = 21; required bool b22 = 22; required bool b23 = 23; required bool b24 = 24; required bool b25 = 25; required bool b26 = 26; required bool b27 = 27; repeated string list = 28; }
View Code
其中的option java_package代表将要生成的javabean所有的包的包名
其中的option java_outer_classname代表要生成的javabean的类名
其中的message Products22可以理解为一个类似C语言的结构体,在生成的javabean中将变成一个内部类,一个.proto文件可以有无数个message
proto支持的类型与修饰符可参考该博客:http://blog.sina.com.cn/s/blog_abea023b0101dxce.html
3、利用编译器编译.proto文件生成javabean
把.proto文件放在.exe同个目录下面,打开cmd,进入同目录下,执行命令:
protoc.exe --java_out=./ test.proto
假如.proto文件没有编写错误的话,成功后在同目录下即有javabean的类生成。
4、引用jar包
jar包地址pom.xml:
<!-- protobuf --> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.0.0-alpha-2</version> </dependency>
5、把刚刚生成的javabean复制到项目中,这里直接使用javabean自带的序列化、反序列化方法
刚刚生成的javabean为:Products2
序列化例子:
public List<byte[]> serializeProtoBufProductsList( List<Builder> builderList) { if(builderList == null) { System.out.println("【ProtoBufSerializeServiceImpl-serializeProtoBufProductsService】builderList==null"); } long start = System.currentTimeMillis(); List<byte[]> bytesList = new ArrayList<byte[]>(); for(Products2.Products22.Builder p22Builder : builderList){ Products2.Products22 p22 = p22Builder.build(); byte[] bytes = p22.toByteArray(); bytesList.add(bytes); } long end = System.currentTimeMillis(); usedTime = end - start ; return bytesList; }
builder对象由来:com.zjm.www.po.Products2.Products22.Builder,即可有生成的javabean点出来。
反序列化例子:
public List<Products22> deserializeProtoBufDataListToProducts22List( List<byte[]> bytesList) { long start = System.currentTimeMillis(); List<Products22> list = new ArrayList<Products22>(); for(byte[] b : bytesList) { try { list.add(Products2.Products22.parseFrom(b)); } catch (InvalidProtocolBufferException e) { e.printStackTrace(); } } long end = System.currentTimeMillis(); usedTime = end - start; return list; }
拿出具体字段例子:
Products22 p = Products2.Products22.parseFrom(b); String s1 = p.getS1(); int i1 = p.getI10(); boolean b1 = p.getB19(); ProtocolStringList l = p.getListList(); for(String s : l) { }
5、protostuff简单教程
5.1 快速入门
引用jar包——学习语法——直接使用
1、引用jar包:
pom.xml:
<!-- protostuff --> <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-core</artifactId> <version>1.0.7</version> <optional>true</optional> <scope>provided</scope> </dependency> <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-runtime</artifactId> <version>1.0.7</version> <optional>true</optional> <scope>provided</scope> </dependency>
2、javabean:
同上面xml的javabean
3、序列化例子:
public List<byte[]> serializeProtoStuffProductsList(List<Products> pList) { if(pList == null || pList.size() <= 0) { return null; } long start = System.currentTimeMillis() ; List<byte[]> bytes = new ArrayList<byte[]>(); Schema<Products> schema = RuntimeSchema.getSchema(Products.class); LinkedBuffer buffer = LinkedBuffer.allocate(4096); byte[] protostuff = null; for(Products p : pList) { try { protostuff = ProtostuffIOUtil.toByteArray(p, schema, buffer); bytes.add(protostuff); } finally { buffer.clear(); } } long end = System.currentTimeMillis() ; this.userTime = end - start; return bytes; }
4、反序列化例子:
public List<Products> deserializeProtoStuffDataListToProductsList( List<byte[]> bytesList) { if(bytesList == null || bytesList.size() <= 0) { return null; } long start = System.currentTimeMillis() ; Schema<Products> schema = RuntimeSchema.getSchema(Products.class); List<Products> list = new ArrayList<Products>(); for(byte[] bs : bytesList) { Products product = new Products(); ProtostuffIOUtil.mergeFrom(bs, product, schema); list.add(product); } long end = System.currentTimeMillis() ; this.userTime = end - start; return list; }