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 ...
随机推荐
- 【BZOJ4592】[Shoi2015]脑洞治疗仪 线段树
[BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. ...
- 【BZOJ3829】[Poi2014]FarmCraft 树形DP(贪心)
[BZOJ3829][Poi2014]FarmCraft Description In a village called Byteville, there are houses connected ...
- coreldraw X6 cdrX6下载激活工具
coreldraw X6 cdrX6下载激活工具 百度网盘 CDRX6下载 激活教程什么的请参考 低吟浅唱 博客
- mysql中排序
排序(默认:asc升序; desc降序 如:根据成绩从高到低排序 select * from stu_info order by mark desc; 根据成绩从低到高排序 select * from ...
- IDEA 录制宏+设置快捷键 实现写时编译
参考: IDEA 录制宏+设置快捷键 实现写时编译:https://blog.csdn.net/wangjie919/article/details/79487981 IDEA 设置运行时不编译项目: ...
- JDK源代码学习系列05----LinkedList
JDK源代码学习系列05----LinkedList 1.LinkedList简单介绍 LinkedList是基于双向 ...
- What are the top 10 things that we should be informed about in life
1.Realize that nobody cares, and if they do, you shouldn't care that they care. Got a new car? Nobod ...
- idea导入项目出现Unable to import maven project: See logs for details提示(转载)
摘要: 从git上面check多工程项目后,maven不能正常下载相应的依赖,最后查询国外网站,找出错误原因.按照此步骤,可以自动配置好每个工程的module. 删除项目根目录下.idea文件夹 关闭 ...
- Python3 标准库
Python3标准库 更详尽:http://blog.csdn.net/jurbo/article/details/52334345 文本 string:通用字符串操作 re:正则表达式操作 diff ...
- boost智能指针总结
智能指针是一种具备指针类似行为的对象,当不在需要它的时候自动删除其引用的c++对象.直接点说就是自动析构C++对象. boost提供了6种智能指针,如下所示: scoped_ptr <boost ...