java 序列化 protobuf_java序列化机制之protobuf(快速高效跨语言)
我们之前曾讲过java自带的一种序列化机制,但是这种机制效率太低,有很多缺点。因此也涌现出了很多优秀的系列化框架,比如说protobuf、protostuff、thrift、hession、kryo、avro、fst、msgpack等等。这篇文章我们就看一下第一个序列化框架protobuf,给出一个简单案例,看看其是如何实现的。注:若你对序列化概念和基本使用还有疑惑,可以翻看我之前的文章,或者百度一些基本概念和作用。
一、为什么要使用protobuf?
使用protobuf的原因肯定是为了解决开发中的一些问题,那使用其他的序列化机制会出现什么问题呢?
(1)java默认序列化机制:效率极低,而且还能不能跨语言之间共享数据。
(2)XML常用于与其他项目之间数据传输或者是共享数据,但是编码和解码会造成很大的性能损失。
(3)json格式也是常见的一种,但是在json在解析的时候非常耗时,而且json结构非常占内存。
但是我们protobuf是一种灵活的、高效的、自动化的序列化机制,可以有效的解决上面的问题。现在应该清楚了吧,正是由于目前的机制存在了很多问题,所以才有了这个序列化框架。
二、如何使用protobuf
protobuf这么优秀使用起来也是非常的简单,我们可以给出其主要的三个步骤,然后使用一个基本的案例去实现一下。
(1)定义.proto文件:我们在这个文件中描述我们序列化的信息,类似于bean类。
(2)根据.proto生成对应的类文件,上面这个proto就像是一个模板,现在我们要根据这个模板创建出一个java类。
(3)序列化。
有了这个基本的步骤我们我们就具体去实现一下:
1、下载安装protobuf
第一步:下载解压
我的电脑是windows10,因此这里给出在windows下的使用,linux下面使用我也将在后续文章推出。我们首先下载protobuf(github上搜索protobuf,有各种语言可供选择)。选择protoc-3.9.0-win64.zip。下载完成之后解压到D:/protobuf目录下面就好了。
第二步:配置环境变量
也就是将D:\protobuf\protoc-3.9.0-win64\bin配置到path环境变量里面。
第三步:验证是否安装成功
最后我们可以在cmd中输入protoc --version验证一下,是否成功。
OK,到这里我们就安装好了。
2、编写proto文件
之前我们说过proto 文件非常类似java的bean。在这里我们在bin目录下新建一个Person.proto文件(和proto.exe)。输入下列内容:
syntax="proto3";
option java_package = "com.fdd.protobuf";
option java_outer_classname = "PersonProto";
message Person {
string name = 1;
int32 age = 2;
}
我们解释一些我们都写了什么
(1)第一行有一个proto3,他表示的是protobuf的语法版本,就类似于jdk1.7和jdk1.8的概念。需要在第一行指定。默认使用的是proto2。
(2)java_package:表示的是java包,不指定就使用 package.生成的类会放到该package下。这里表示把生成的类存放在com.fdd.protobuf包下面。
(3)java_outer_classname:我们说过.proto文件,要生成对应的类,这个参数就指定输出什么类名。这里表示生成的类名是PersonProto。
(4)message 是用于数据格式定义.一个 .proto 文件中可以定义多个 message
message 中定义的字段支持 string、byte、bool、map、enum、数字类型和用户自定义的 message
定义字段后面需要指定唯一的标识数字,这些数字用于识别二进制格式 message 中的字段,一旦开始使用这个 message,那么标识数字就不能改变
如果需要定义 List,则在字段前加repeated即可.
如果已经使用过该 message 生成的类后,想要增加字段直接新增即可.当新增字段的类解析老数据时,会将新字段置为默认值.当旧的类解析新数据时会忽视掉新增字段.
比如说这里我们就定义一个复杂的proto文件:
syntax = "proto3";
option java_package = "com.fdd.protobuf";
option java_outer_classname = "Persons";
message Staff {
int32 id = 1;
string name = 2;
int32 age = 3;
// 枚举示例 enum PhoneType {
MOBILE = 0;
TELEPHONE = 1;
}
// 嵌套示例 message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
// list示例 repeated PhoneNumber phone = 4;
message Map {
string key = 1;
int32 value = 2;
}
// map示例 Map map = 5;
}
由于这里只是展示一个基本案例,对于其他的数据类型可以根据自己的需要定义即可。
3、根据proto文件生成class类文件
编译起来很简单,在我们下载好的protobuf下面有一个bin目录,里面有一个proto.exe。我们就使用这个去编译person.proto文件就好。
也就是执行proto.exe --java_out = / Person.proto就会编译成功。
4、使用class类文件
上面意味着我们已经做好了序列化的准备工作,接下来我们就可以直接使用这个类了。
(1)第一步:将生成的PersonProto类引入到我们的IDEA或者是eclipse中。
(2)第二步:在idea或者是eclipse添加protobuf的依赖。
com.google.protobuf
protobuf-java
3.9.0
(3)第三步:使用
首先看一些如何序列化:
//1、 创建BuilderPersonProto.Person.Builder builder = PersonProto.Person.newBuilder();
//2、 设置Person的属性builder.setAge(20);
builder.setName("java的架构师技术栈");
//3、 创建PersonPersonProto.Person person = builder.build();
//4、序列化byte[] data = person.toByteArray();
//5、将data保存在本地或者是传到网络
然后反序列化
try {
//一行代码实现反序列化,data可以是本地数据或者是网络数据 PersonProto.Person person = PersonProto.Person.parseFrom(data);
System.out.println(person.getAge());
System.out.println(person.getName());
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
简单吧,基本上就是我们定义好proto文件,然后使用proto.exe编译成类文件,最后导入这个类和依赖就可以直接使用了。当然这只是一个最简单不过的代码,可以把这篇教程当成一个简单的使用教程。一般情况是是结合SpringBoot来使用的。具体使用会陆续推出。
java 序列化 protobuf_java序列化机制之protobuf(快速高效跨语言)相关推荐
- 序列每天从0开始_序列化、反序列化原理和Protobuf实现机制
1.基本概念 1.1 什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: (2)序列化:对象序列化的最主要的 ...
- java文件序列化_通过快速Java和文件序列化加快速度
java文件序列化 从Java的第一个版本开始,许多开发人员每天都在努力实现至少与C / C ++一样好的性能. JVM供应商正在通过实现一些新的JIT算法来尽力而为,但仍有许多工作要做,尤其是在我们 ...
- 通过快速Java和文件序列化加快速度
从Java的第一个版本开始,每天都有许多开发人员试图至少达到与C / C ++一样好的性能. JVM供应商正在通过实现一些新的JIT算法来尽力而为,但仍有许多工作要做,尤其是在我们如何使用Java方面 ...
- java对象的序列化机制详解
Java对象的序列化机制 Java对象的序列化,是将内存中的java对象转化为二进制的字节流,然后保存到磁盘中或者在网络上.这就是序列化对象,反序列化顾名思义就是将对象的二进制字节流恢复成原来的对象. ...
- Java学习系列(十二)Java面向对象之序列化机制及版本
序列化:内存中的Java对象<-->二进制流 目的:a)有时候需要把对象存储到外部存储器中持久化保存,b)还有时候,需要把对象通过网络传输. 可序列化的对象,Java要求可序列化的类实现下 ...
- fileinputstream自定义类序列化和反序列化_Rest Assured篇:Java中的序列化和反序列化...
点击上方蓝字设为星标 每天傍晚伴你一起成长! Java 中的序列化和反序列化是一个重要的编程概念.它适用于所有主要的编程语言.在本章中,我们将尝试在Java语言的上下文中理解此概念.在本章的最后,我们 ...
- Java对象XML序列化框架-Simple2.0
Java对象XML序列化框架-Simple2.0 Simple是一个XML序列化框架,一个Java 版本宽容的序列化框架,能够快速在Java 平台上开发XML.支持通过annotations完全配置化 ...
- java 对象怎么序列化,java对象序列化总结
java对象序列化小结 百度百科上介绍序列化是这样的: 序列化 (Serialization): 将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储 ...
- java-Transient关键字、Volatile关键字介绍和序列化、反序列化机制、单例类序列化
- Transient关键字 Java的serialization提供了一种持久化对象实例的机制.当持久化对象时,可能有一个特殊的对象数据成员,我们不想 用serialization机制来保存它.为 ...
最新文章
- SAP有用的知识(持续更新)
- Python实现拉格朗日插值法
- Linux之whereis、which、find、location的区别和用法
- public、protected、default、private区别
- java程序中用户名和密码_在Java应用程序中使用密码术
- datatables 响应式
- string、char *、char []之间的相互转换
- docsify神奇的文档网站生成工具
- Codeforces Round #198 (Div. 1) B,C 动态规划
- cv mat保存图片_EmguCV创建/保存图片
- Android 自定义标题栏(title栏)
- 图像测试环境软件,Digimizer(图像测量分析软件)
- 最详细教学--实现win10 多用户同时远程登录内网机--win10+frp+rdpwrap+阿里云服务器
- 本文讲述chmod +x或chmod 755或chmod -r几个流行命令的含义与使用方法
- easyui的combobox根据拼音搜索选项
- 【Proteus仿真】Arduino UNO + PCF8563 +LCD1602时间显示
- python matplotlib柱状图显示数据标签及百分号
- linux命令——ll详解
- Ubuntu16.04挂载exfat格式U盘
- X4扭曲字体或图形 coreldraw_CorelDRAW X4下载
热门文章
- dp 1.4协议_浅析关于HDMI接口与DP接口
- html获取data-*值,html5 获取和设置data-*属性值的四种方法讲解
- c#时分秒毫秒微妙_你真的清楚DateTime in C#吗?
- java8的路径_什么是路径?
- python图像对比_用python实现对比两张图片的不同
- 数据库杂谈(二)——数据模型
- Oracle工具使用(export,import,sqlldr中文帮助及实例))
- mariadb允许远程访问权限
- [react] React15和16别支持IE几以上?
- [react] 说说你对React的渲染原理的理解