Protobuf的上手使用
这里不赘述Json和Protobuf的比较和区别,只谈谈简单的使用
1.在Client-Server交互的过程中,都是以二进制数据传输,所以Json和Protobuf在使用的过程中,都存在序列化和反序列的过程
2.使用json封装的数据,在通信(序列化-反序列化)的过程中,可以直接在工程中定义二进制数据需要映射成的类,有很多第三方的解析工具,jackson,fastjson等
而Protobuf一般都是使用google提供的解析工具,没有办法直接定义一些类去进行映射需要
A)通过定义proto文件,proto文件里面存放的是 按照googel定义的消息格式编写的一些对象消息,
只要实现相同的协议格式即同一proto文件,可以被编译成不同的语言版本(Java,C++,Python等)
如下:定义一个User.proto文件
option java_package="**.**";
option java_outer_classname="****"; message User{
required int32 ID=1;
required string userName=2;
required string Password=3;
repeated string address=4;
}
java_package 指定得到的包名(package ××××)
java_outer_classname 指定最后输出的文件名
B)用 protoc.exe 生成User.proto的协议文件(Windows):protoc工具需要下载
进入到proto.exe所在目录,执行 protoc.exe --java_out=. User.proto
也可以直接安装protobuf,linux环境也是需要安装protobuf (具体可以看linux安装配置protobuf)
C)命令执行成功之后,会生成proto文件中的约定,生成对应的java文件,有了这个java文件,才能对protobuf封装过的二进制数据完成对象的映射
D)测试类
protobuf对象->二进制数据->protobuf对象
public class Test { private static byte[] encode(UserProto.User user) {
return user.toByteArray();
} private static UserProto.User decode(byte[] body)
throws InvalidProtocolBufferException {
return UserProto.User.parseFrom(body);
} public static void main(String[] args)
throws InvalidProtocolBufferException { UserProto.User.Builder builder = UserProto.User.newBuilder();
builder.setID(1);
builder.setUserName("Lilinfeng");
builder.setPassword("Netty Book");
List<String> address = new ArrayList<String>();
address.add("NanJing YuHuaTai");
address.add("BeiJing LiuLiChang");
address.add("ShenZhen HongShuLin");
builder.addAllAddress(address);
UserProto.User user = builder.build(); System.out.println("Before encode : " + user.toString());
UserProto.User user2 = decode(encode(user));
System.out.println("After decode : " + user2.toString());
System.out.println("Assert equal : --> " + user2.equals(user)); } }
注:上述示例的proto文件遵循的是protobuf2的标准(syntax = "proto2")
如果是protobuf3的标准,需要在首行加上syntax = "proto3" 用以说明,并且需要使用对应版本的 protoc 工具
使用不同小版本的 protoc 得到的.java文件可能不同,向下兼容,只需要大版本相互保持一致
Protobuf的上手使用的更多相关文章
- [转]PHP 下使用 ZeroMQ 和 protobuf
FROM : http://www.68idc.cn/help/makewebs/php/20150118175432.html 前言 这个记录总的来说分两部分: 搭建环境. 简单使用教程. 搭建环境 ...
- [转]Caffe 深度学习框架上手教程
Caffe 深度学习框架上手教程 机器学习Caffe caffe 原文地址:http://suanfazu.com/t/caffe/281 blink 15年1月 6 Caffe448是一个清 ...
- Caffe 深度学习框架上手教程
Caffe 深度学习框架上手教程 blink 15年1月 Caffe (CNN, deep learning) 介绍 Caffe -----------Convolution Architec ...
- 零基础学习hadoop到上手工作线路指导(编程篇)
问题导读: 1.hadoop编程需要哪些基础? 2.hadoop编程需要注意哪些问题? 3.如何创建mapreduce程序及其包含几部分? 4.如何远程连接eclipse,可能会遇到什么问题? 5.如 ...
- protobuf 源代码分析 (1)准备工作
protobuf简介 protobuf是google开源的跨平台的一种数据序列化的代码自动生成器,支持c++.java和python语言,支持跨网络的传输数据,与平台类型无关.并且其生产的序列化数据具 ...
- python通过protobuf实现rpc
由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...
- 【Python五篇慢慢弹】快速上手学python
快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...
- Impress.js上手 - 抛开PPT、制作Web 3D幻灯片放映
前言: 如果你已经厌倦了使用PPT设置路径.设置时间.设置动画方式来制作动画特效.那么Impress.js将是你一个非常好的选择. 用它制作的PPT将更加直观.效果也是嗷嗷美观的. 当然,如果用它来装 ...
- ECharts数据图表系统? 5分钟上手!
目录: 前言 简介 方法一:模块化单文件引入(推荐) 方法二:标签式单文件引入 [前言] 最近在捣鼓各种插件各种框架,发现这个ECharts还是比较不错的,文档也挺全的,还是中文的,给大家推荐一下. ...
随机推荐
- navicat for mysql 如何设置字段唯一
在设计表时,上面会有索引这一项 点开,在栏位处选择你需要设置的字段,然后选择unique索引类型即可 望采纳,谢谢!
- C# 实现HTTP的POST(完整可运行并且通过测试的代码)
https://blog.csdn.net/qq_21381465/article/details/80016159 我是通过VS2010 ,新建一个winform窗体项目,然后写了一个测试软件,软件 ...
- SpringCloud中遇到的问题总结
1.如果数据库URL字符串中不加serverTimezone=GMT%2B8且数据库未设置时区,会报如下错误 Caused by: com.mysql.cj.exceptions.InvalidCon ...
- 【SpringBoot】SpringBoot快速入门(一)
SpringBoot介绍 Spring Boot使创建可运行的独立,生产级基于Spring的应用程序变得容易.对Spring平台和第三方库整合,这样就可以以最小的麻烦开始使用.大多数Spring Bo ...
- 认领该应用 apk空白包签名 方法
起因: apicloud开发的项目,上架应用宝市场,被要求做这个 解决方法: 下载签名工具,并解压缩.解压缩.解压后是两个文件夹,选择keystore签名工具. 下载地址: linux 签名工具(命令 ...
- 安装 gearman
准备:php 对应gearman插件包 https://pecl.php.net/package/gearman 1. 先安装依赖库 [root@VM_27_0_centos /]# yum inst ...
- 【vim小小记】vim的复制粘贴(包括系统剪贴板)
1.vim常用复制粘贴命令 Vim的复制粘贴命令无疑是y (yank),p(paster),加上yy,P PS: vim有个很有意思的约定(我觉得是一种约定),就是某个命令的大小写都是实现某种功能,只 ...
- ERP解析外围系统json数据格式
外围系统调用ERP的WebService接口,将数据以json格式传到ERP,ERP解析json 1.创建java source jsp,提供java方法解析json数据 create or repl ...
- Apache Kafka工作流程| Kafka Pub-Sub Messaging
1.目标 在我们上一篇Kafka教程中,我们讨论了Kafka Docker.今天,我们将讨论Kafka Workflow.此外,我们将详细介绍Pub-Sub Messaging的工作流程以及Queue ...
- KAFA架构及其基本概念
1.目标 - KAFA价格 在我们上一篇Kafka教程中,我们讨论了Kafka用例和应用程序.今天,在这个Kafka教程中,我们将讨论Kafka Architecture.在这篇Kafka Archi ...