前言

1. 什么是protobuf

Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,是一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,可用于通讯协议数据存储等领域。

2.

- 平台无关,语言无关,可扩展;
- 提供了友好的动态库,使用简单;
- 解析速度快,比对应的XML快约20-100倍;
- 序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。

安装

MAC/OS 安装

1. 下载

https://github.com/google/protobuf/releases下载protobuf-all-3.5.1.tar.gz

2. 解压 tar xvf protobuf-all-3.5.1.tar.gz

3. 编译并安装

  1. cd protobuf.3.5.1
  2. ./configure
  3. make
  4. make check
  5. make install

4. 验证

  1. protoc --version

一个简单的例子

1. 创建 .proto 文件

  1. syntax = "proto3";
  2.  
  3. package tutorial;
  4.  
  5. option java_package = "com.example.tutorial";
  6. option java_outer_classname = "AddressBookProtos";
  7.  
  8. message Person {
  9. string name = 1;
  10. int32 id = 2;
  11. string email = 3;
  12. }
  13.  
  14. message AddressBook {
  15. repeated Person people = 1;
  16. int32 id = 2;
  17. }

2. 编译

  1. protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto

使用上面的命令格式生成编译很好的Java class文件

3. 创建Maven项目,添加pom依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6.  
  7. <groupId>protobuftest</groupId>
  8. <artifactId>protobuftest</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10.  
  11. <dependencies>
  12. <dependency>
  13. <groupId>com.google.protobuf</groupId>
  14. <artifactId>protobuf-java</artifactId>
  15. <version>3.5.1</version>
  16. </dependency>
  17. </dependencies>
  18.  
  19. </project>

项目的结构如上图所示。

4. 新建一个Test类来进行测试

  1. package com.example.tutorial;
  2.  
  3. import java.io.IOException;
  4.  
  5. public class Test {
  6. public static void main(String[] args) throws IOException {
  7. AddressBookProtos.Person.Builder pbulider = AddressBookProtos.Person.newBuilder();
  8. pbulider.setId(1);
  9. pbulider.setName("jinhong");
  10. pbulider.setEmail("1060951934@qq.com");
  11. AddressBookProtos.Person person = pbulider.build();
  12.  
  13. AddressBookProtos.AddressBook.Builder builder = AddressBookProtos.AddressBook.newBuilder();
  14. builder.addPeople(person);
  15. builder.setId(1);
  16. AddressBookProtos.AddressBook addressBook = builder.build();
  17.  
  18. System.out.println("before :" + addressBook.toString());
  19.  
  20. System.out.println("addressBook byte");
  21. for (byte b : addressBook.toByteArray()) {
  22. System.out.println(b);
  23. }
  24.  
  25. System.out.println(addressBook.toByteString());
  26.  
  27. byte[] byteArray = addressBook.toByteArray();
  28. AddressBookProtos.AddressBook person2 = AddressBookProtos.AddressBook.parseFrom(byteArray);
  29.  
  30. System.out.println("after: " + person2.toString());
  31. }
  32. }

测试的结果如下:

通过上面的测试,我们简单了解了protobuf的使用。后续将继续深入了解protobuf的一些细节。

在学习的时候建议多了解下IDL(interface discription language)的概念,它是跨语言和平台的关键。

protobuf3.5.1使用的简单例子的更多相关文章

  1. Hibernate4.2.4入门(一)——环境搭建和简单例子

    一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...

  2. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  3. spring mvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  4. ko 简单例子

    Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模板 ...

  5. mysql定时任务简单例子

    mysql定时任务简单例子 ? 1 2 3 4 5 6 7 8 9     如果要每30秒执行以下语句:   [sql] update userinfo set endtime = now() WHE ...

  6. java socket编程开发简单例子 与 nio非阻塞通道

    基本socket编程 1.以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理 2.以下代码使用了1.8新特 ...

  7. 一个简单例子:贫血模型or领域模型

    转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...

  8. [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select

    以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计 ...

  9. jsonp的简单例子

    jsonp的简单例子 index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...

随机推荐

  1. SpringBoot——定时任务+WebSocket(问题)

    开发环境:win7 + idea2018 + jdk 1.8 + springboot 2.x 记一次出现问题,我在项目中先集成了websocket环境,并且测试通过,之后想要模拟实时推送的效果,虽然 ...

  2. Python入门之面向对象的多态

    本章目录: 一.多态 二.多态性 三.鸭子类型 ============================== 一.多态 多态指的是一类事物有多种形态. 动物有多种形态:人,狗,猪. import ab ...

  3. 03: Django Model数据库操作

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  4. 20145330 《网络对抗》PC平台逆向破解:注入shellcode 和 Return-to-libc 攻击实验

    20145330 <网络对抗>PC平台逆向破解:注入shellcode 实验步骤 1.用于获取shellcode的C语言代码 2.设置环境 Bof攻击防御技术 需要手动设置环境使注入的sh ...

  5. 20165310 java_blog_week3

    2165310 <Java程序设计>第3周学习总结 教材学习内容总结 类 声明与命名规则 驼峰原则 变量:体现属性 方法:体现行为/功能 变量: 成员变量与局部变量: 成员变量:有效范围: ...

  6. VC++ 文件和应用程序关联,默认图标不显示问题

  7. c/c++ 动态申请数组(转载)

    转载:http://blog.csdn.net/hondely/article/details/6779887 转载:http://bbs.csdn.net/topics/390721031 转载:h ...

  8. JS 获取浏览器的宽和高

    网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...

  9. babun安装,整合到cmder

    babun Babun的特性: 预装了Cygwin以及许多的插件 默认的命令行安装工具,没有管理员权限要求. 预装了 pact工具,一个高级的包管理器,类似 apt-get或yum xTerm-256 ...

  10. hdu 6180 Schedule

    Schedule Problem Description There are N schedules, the i-th schedule has start time si and end time ...