这里不赘述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的上手使用的更多相关文章

  1. [转]PHP 下使用 ZeroMQ 和 protobuf

    FROM : http://www.68idc.cn/help/makewebs/php/20150118175432.html 前言 这个记录总的来说分两部分: 搭建环境. 简单使用教程. 搭建环境 ...

  2. [转]Caffe 深度学习框架上手教程

    Caffe 深度学习框架上手教程 机器学习Caffe caffe 原文地址:http://suanfazu.com/t/caffe/281   blink 15年1月 6   Caffe448是一个清 ...

  3. Caffe 深度学习框架上手教程

    Caffe 深度学习框架上手教程   blink 15年1月   Caffe (CNN, deep learning) 介绍 Caffe -----------Convolution Architec ...

  4. 零基础学习hadoop到上手工作线路指导(编程篇)

    问题导读: 1.hadoop编程需要哪些基础? 2.hadoop编程需要注意哪些问题? 3.如何创建mapreduce程序及其包含几部分? 4.如何远程连接eclipse,可能会遇到什么问题? 5.如 ...

  5. protobuf 源代码分析 (1)准备工作

    protobuf简介 protobuf是google开源的跨平台的一种数据序列化的代码自动生成器,支持c++.java和python语言,支持跨网络的传输数据,与平台类型无关.并且其生产的序列化数据具 ...

  6. python通过protobuf实现rpc

    由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...

  7. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

  8. Impress.js上手 - 抛开PPT、制作Web 3D幻灯片放映

    前言: 如果你已经厌倦了使用PPT设置路径.设置时间.设置动画方式来制作动画特效.那么Impress.js将是你一个非常好的选择. 用它制作的PPT将更加直观.效果也是嗷嗷美观的. 当然,如果用它来装 ...

  9. ECharts数据图表系统? 5分钟上手!

    目录: 前言 简介 方法一:模块化单文件引入(推荐) 方法二:标签式单文件引入 [前言] 最近在捣鼓各种插件各种框架,发现这个ECharts还是比较不错的,文档也挺全的,还是中文的,给大家推荐一下. ...

随机推荐

  1. 文件分片 浏览器文件大小限制 自定义请求头 在一个资源的加载进度停止之后被触发 arrayBuffer 异步 二进制数据缓存区

    js 整数限制 浏览器文件大小限制 https://w3c.github.io/FileAPI/#dom-blob-arraybuffer https://developer.mozilla.org/ ...

  2. disruptor 组件理解

    disruptor 中核心组件包括 RingBuffer.Event .EventHandler.Sequence.Sequence Barrier. WaitStrategy.WorkProcess ...

  3. Ubuntu新建用户并指定目录

    例如我要新建一个nginx用户,并指定目录,允许使用bash登录 sudo useradd -d "/home/nginx" -m -s "/bin/bash" ...

  4. [LeetCode] 68. Text Justification 文本对齐

    Given an array of words and a length L, format the text such that each line has exactly L characters ...

  5. PHPExcel 中文使用手册详解 二

    $objPHPExcel = new \PHPExcel(); //定义配置 $topNumber = 2;//表头有几行占用 $xlsTitle = iconv('utf-8', 'gb2312', ...

  6. POJ 2106 Boolean Expressions

    总时间限制: 1000ms  内存限制: 65536kB 描述 The objective of the program you are going to produce is to evaluate ...

  7. String初解

    String 类型是不可变的对象,因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后有一次看到一个代码段,如下: 这段代码返回的是ture,当时以为是f ...

  8. 【C++面试】关于虚函数的常见问题

    1.虚函数的代价 1)带有虚函数的每个类会产生一个虚函数表,用来存储虚成员函数的指针 2)带有虚函数的每个类都会有一个指向虚函数表的指针 3)不再是内敛函数,因为内敛函数可以在编译阶段进行替代,而虚函 ...

  9. 04 Mybatis 框架的环境搭建及入门案例

    1.搭建 Mybatis 开发环境 mybatis的环境搭建 第一步:创建maven工程并导入坐标 第二步:创建实体类和dao的接口 第三步:创建Mybatis的主配置文件 SqlMapConifg. ...

  10. ubuntu sh脚本激活conda 虚拟环境

    第一步:初始化coda 命令:sudo gedit ~/.bashrc 第二部:复制其中这样一段代码 # >>> conda initialize >>> # !! ...