Google protobuf序列化以及反序列化
序列化的目的是将对象持久化到硬盘或者用于网络传输。java也提供了序列化技术,非常简单,只要实现Serializable接口即可。如下:
public class commonService implements Serializable { private static final long serialVersionUID = 1L;
}
这种方式有以下几个缺点:(1)无法跨语言 (2)序列化的码流太大 (3)序列化的性能差
下面我测试一下序列化一个对象后的大小,代码如下:
public class TestBuf implements Serializable { private int id;
private String url;
private ArrayList<String> name; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
} public ArrayList<String> getName() {
return name;
} public void setName(ArrayList<String> name) {
this.name = name;
}
}
public static void main(String[]args)throws IOException{ TestBuf testBuf1 = new TestBuf();
testBuf1.setId(1);
testBuf1.setUrl("www.baidu.com");
ArrayList<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
testBuf1.setName(list);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream outputStream1 = new ObjectOutputStream(outputStream);
outputStream1.writeObject(testBuf1);
System.out.println("Serializable====="+outputStream.toByteArray().length);
}
运行结果如下:
接下来我们使用google protobuf,序列化同一个对象,看看序列化后的对象大小。
(1)首先下载 protoc.exe和protobuf-java-2.5.0.jar ,地址http://download.csdn.net/detail/yangheng362/8516923
(2)编写proto文件,这里命名为test.proto,代码如下:
package protobuf;
option java_package = "com.test.protobuf";
option java_outer_classname = "FirstProtobuf";
message testBuf {
required int32 ID = 1;
optional string Url = 2;
repeated string name=3;
}
option java_package = "com.test.protobuf"; 就是生成的路径。
option java_outer_classname = "FirstProtobuf"; 就是生成的类名称。
required\optional\repeated就是一些修饰符,分别是必填,可选以及集合。
(3)将文件放在解压的protoc.exe同级目录下,启动cmd控制台,执行代码如下:
protoc ./test.proto --java_out=./
(4)把生成的文件FirstProtobuf.java拷到新建的java目录下, 引入jar包 protobuf-java-2.5.0.jar
(5)测试序列化以及反序列化,代码如下:
public class TestProtobuf { public static void main(String[]args)throws IOException{
FirstProtobuf.testBuf.Builder builder = FirstProtobuf.testBuf.newBuilder();
builder.setID(1);
builder.setUrl("www.baidu.com");
builder.addName("aaa");
builder.addName("bbb");
builder.addName("ccc");
FirstProtobuf.testBuf info = builder.build();
byte[] result = info.toByteArray();
System.out.println("google protobuf====="+result.length);
FirstProtobuf.testBuf testBuf = FirstProtobuf.testBuf.parseFrom(result);
System.out.println(testBuf);
} }
显示结果如下:同样的对象,使用java自带的序列化的大小为201字节,而google的protobuf只有32个字节。
参考地址:http://www.tuicool.com/articles/EJrQRr3
Google protobuf序列化以及反序列化的更多相关文章
- ProtoBuf序列化和反序列化方法
最近公司需要将以前的协议全都改成ProtoBuf生成的协议,再将结构体打包和解包过程终于到一些问题 ,无法使用Marshal.SizeOf计算结构体大小,最后找了一下ProtoBuf的文档,可以用它自 ...
- google protobuf序列化原理解析 (PHP示例)
一.简介 Protocol Buffers是谷歌定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据量小, ...
- Java数据通讯中使用Googgle Protobuf 序列化与反序列化
概念 1.什么是protocol buffer ProtocolBuffer是用于结构化数据串行化的灵活.高效.自动的方法,有如XML,不过它更小.更快.也更简单.你可以定义自己的数据结构,然后使用代 ...
- protobuf序列化、反序列化
引用dllprotobuf-net.rar /// <summary> /// buf序列化 /// </summary> public static String Seria ...
- python protobuf序列化repeated运用
下面是proto描述文件的定义 message Person { required string name = 1; required int32 id = 2; optional string em ...
- windows环境下protobuf的java操作{编译,序列化,反序列化}
google protocol buffer的使用和原理 概况: Protocol Buffers(也就是protobuf)是谷歌的语言中立的.平台中立的.可扩展的用于序列化结构化的数据: windo ...
- C# 使用 protobuf 进行对象序列化与反序列化
protobuf 是 google的一个开源项目,可用于以下两种用途: (1)数据的存储(序列化和反序列化),类似于xml.json等: (2)制作网络通信协议. 源代码下载地址:https://gi ...
- 序列化和反序列化及Protobuf 基本使用
序列化和反序列化 序列化和反序列化在平常工作中会大量使用,然而并不一定非常清楚它的概念.序列化和反序列化的选型却是系统设计或重构一个重要的环节,在分布式.大数据量系统设计里面更为显著.机器间的通信需要 ...
- [Go] 使用protobuf进行序列化和反序列化
先定义消息类型 orders.proto syntax = "proto2"; package message; message Orders { required int32 o ...
随机推荐
- linux ftp 上传与下载命令解析
month=`date -d "last month" +"%Y%m"` year=`date +"%Y"` rm /home/yourDi ...
- cocos2d-X学习之主要类介绍:精灵角色(CCSprite)
CCSprite是一副2D图像,CCSprite可以通过图像或者图像中的一个矩形子区域创建 如果它的父节点或者任意继承树上的节点是CCspriteBatchNode则具有下述特性: 父节点是CCSpr ...
- 纯java实现邮件发送服务(亲测好用)
今天自己测试了一下用java代码实现发送有限的服务,非常简单.直接贴代码: import com.sun.mail.util.MailSSLSocketFactory; import javax.ma ...
- delphi xe-intarweb 功能记录
IWServerController.HistoryEnabled := True; //使浏览器后退.前进按钮有效TIWForm2.Create(WebApplication).Show; //建 ...
- IO 流中编码和解码问题
编码表 ASCII : American Standard Code for Information Interchange 使用一个字节的 7 位可以表示 ISO8859-1 : 拉丁码表. 欧洲码 ...
- 数据库字符集(AL32UTF8)和客户端字符集(2%)是不同的
登录oracle数据库时我们会遇到这样的提示信息:“数据库字符集(AL32UTF8)和客户端字符集(2%)是不同的”. 这是由于数据库服务端和客户端的字符集不一致所造成的,服务端字符集和客户端字符集相 ...
- Java应用多机器部署定时任务解决方案
Java多机部署下定时任务的处理方案. 本文转自:http://www.cnblogs.com/xunianchong/p/6958548.html 需求: 有两台服务器同时部署了同一套代码, 代码中 ...
- centos Docker安装前升级内核3.10的方法
首先我虚拟机系统都是Centos 6.5 .ESXI ,后安装devel .ESXI 后来 .ESXI 我所操作的都是虚拟机,但是在真实机上面如何我就不清楚了~~ 大家一定要记得安装步骤,,,不然就是 ...
- python全栈开发从入门到放弃之列表的内置方法
1.列表切片 l=['a','b','c','d','e','f'] print(l[1:5]) # 根据索引号来切片,但顾头不顾尾 ['b', 'c', 'd', 'e'] print(l[1:5: ...
- php 获取数组中的key值
<?php $arr = array( 'book' => 1, 'data' => 'data', 'music' => 'music', 'img' => 'img' ...