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还是比较不错的,文档也挺全的,还是中文的,给大家推荐一下. ...
 
随机推荐
- Proxy Server源码及分析(TCP Proxy源码 Socket实现端口映射)
			
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u014530704/article/de ...
 - 如何下载官网最新版 win10 系统?
			
如何下载官网最新版 win10 系统?步骤: 一. 下载 遨游浏览器 将UA切换成,手机访问:推荐 UC浏览器,UA设置: Mozilla/5.0 (Linux; U; Android 8.0.0; ...
 - Microsoft Office Project 2016使用心得(一)
			
Microsoft Office Project 2016使用心得(一) 新创建一个项目后的准备工作 1.修改项目开始时间 因为项目默认显示的是2009年的信息,所有视图都是从2009年开始,不便于查 ...
 - Windows10下安装Git
			
Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.具体安装步骤如下: 第一步:先从官网下载最新版本的Git 官网地址:https://git-scm.com/do ...
 - EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器的视频直播录像、检索、回放方案
			
需求背景: 近期遇到客户反馈对于直播摄像机录像功能是有一定的需求点的,其实EasyDarwin团队早就研发出对应功能,只是用户对于产品没有足够了解,因此本篇将对录像功能来做一次介绍. 首先,录像就是对 ...
 - 基于EasyNVR摄像机网页无插件直播服务二次开发实现H5播放页面的简单集成方案
			
我们通常在构架一套视频SaaS应用的过程中,将平台设计为3层:视频硬件层(视频源).视频能力平台(vPaaS).视频应用平台(vSaaS),视频硬件包括各种IPC.NVR.编码器等视频生成设备,vPa ...
 - redis连接时报错:Could not connect to Redis at 127.0.0.1:6379: Connection refused
			
在/etc目录下找到redis.conf 将daemonize no 修改为 daemonize yes 再输入 redis-server /usr/local/etc/redis.conf redi ...
 - copyProperties 忽略null值字段
			
在做项目时遇到需要copy两个对象之间的属性值,但是有源对象有null值,在使用BeanUtils来copy时null值会覆盖目标对象的同名字段属性值,然后采用以下方法找到null值字段,然后忽略: ...
 - [LeetCode] 160. Intersection of Two Linked Lists 求两个链表的交集
			
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
 - [LeetCode] 360. Sort Transformed Array 排序转换后的数组
			
Given a sorted array of integers nums and integer values a, b and c. Apply a function of the form f( ...