ProtoBuf介绍

ProtoBuf 是google团队开发的用于高效存储和读取结构化数据的工具,google出品,必属精品。

目前最新版本为3。文档地址:https://developers.google.com/protocol-buffers/docs/proto3

相比于xmljsonprotobuf压缩率更高,传输高效,自然很节省流量。

protobuf支持跨语言,貌似前后端使用javaJavaScript的众多吧。

整理下java和JavaScript的例子

需要下载protoc可执行文件。通过编写.proto,命令生成相应的文件,比如java,js等。

编写Person.proto。

具体语法可以查看官网,这是最基础的一个对象。

syntax = "proto3";
option java_package = "com.dahai.protobuf";
option java_outer_classname = "PersonModel"; message Person {
int32 id = 1;
string name = 2;
int32 age = 3;
string email = 4;
}

可以通过protoc命令生成,此处为了方便起见,使用maven plugin来生成(原理一直,会下载相应的protoc可执行文件)

创建maven工程,在resources目录创建proto文件夹,将示例文件Person.proto放入改文件夹下。

pom.xml引入相应依赖

    <dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.11.1</version>
</dependency>

pom.xml引入相应的插件


<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.6.2</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<extensions>true</extensions>
<configuration>
<!--指定项目的proto文件目录-->
<protoSourceRoot>src/main/resources/proto</protoSourceRoot>
<clearOutputDirectory>false</clearOutputDirectory>
<!--不存在会自动下载-->
<protocArtifact>
com.google.protobuf:protoc:3.11.1:exe:${os.detected.classifier}
</protocArtifact>
<pluginId>grpc-java</pluginId>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

执行标红箭头的命令即可生成。

将生成的文件放入相应的包下面即可

demo测试

    @Test
public void test3() throws InvalidProtocolBufferException {
// 创建person对象
Person person = Person.newBuilder()
.setId(1)
.setName("陈海洋")
.setAge(18)
.setEmail("1559843332@qq.com")
.build(); System.out.println(person); // 反序列化获取person
byte[] bytes = person.toByteArray();
Person newPerson = Person.parseFrom(bytes);
System.out.println(newPerson);
}

使用protobuf是为了节省用户流量,来实战下。

java作为服务端+客户端测试

// 暴露接口,返回二进制数据
@GetMapping("/person/{id}")
public byte[] person(@PathVariable("id") Integer id) { Person person = Person.newBuilder()
.setId(id)
.setName("陈海洋")
.setAge(18)
.setEmail("1559843332@qq.com")
.build(); return person.toByteArray();
} // RestTemplate客户端测试
@Test
public void test1() throws IOException { RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost:8881/demo/person/2";
ResponseEntity<Resource> forEntity = restTemplate.getForEntity(url, Resource.class);
Person person = Person.parseFrom(forEntity.getBody().getInputStream());
System.out.println(person); }

客户端前端调用示例

既然是跨平台,js肯定也是可以解析二进制流的。

前端也可以通过proto文件生成相应的js。如下是js反序列化示例

为了写前端demo,也是爬了好多坑,都是泪啊!(本想基于原生的)

import messages from '../../utils/proto/person.js'

axios({
method: 'get',
url: 'http://localhost:8881/demo/person/10',
responseType: 'arraybuffer'
}).then((res) => {
console.log('res.data', res.data)
var person = messages.Person.decode(new Uint8Array(res.data))
console.log('java', person)
console.log('java id', person.id)
}
)

这只是demo,实际项目一般不会反悔bety[]数据。在我们的业务中是通过websocket来传输的。

项目地址

https://github.com/chywx/spring-boot-chy/tree/master/chy-protobuf

参考

用Maven实现一个protobuf的Java例子

protobufjs语法

axios 基本用法

JS中ArrayBuffer和Uint8Array区别

HTML5 Blob与ArrayBuffer、TypeArray和字符串String之间转换

protobuf基于java和javascript的使用的更多相关文章

  1. Rhino -- 基于java的javascript实现

    http://www.cnblogs.com/cczw/archive/2012/07/16/2593957.html

  2. 基于类(Java)和基于原理(JavaScript)的对象系统的比较

    Java:面向对象编程语言,吸收了C++语言的各种优点,丢掉了C++让人头疼的多继承.指针等概念.具有功能强大和简单易用的两大特征.Java具有简单性.面向对象.分布式.健壮性.安全性.平台独立与可移 ...

  3. 基于java平台的常用资源整理

    这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...

  4. 基于Java Netty框架构建高性能的部标808协议的GPS服务器

    使用Java语言开发一个高质量和高性能的jt808 协议的GPS通信服务器,并不是一件简单容易的事情,开发出来一段程序和能够承受数十万台车载接入是两码事,除去开发部标808协议的固有复杂性和几个月长周 ...

  5. 这里整理了基于java平台的常用资源

    这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...

  6. WebView上实现Java与JavaScript交互

    在安卓开发上,考虑到开发效率和界面更新,有时使用WebView结合web页面技术,可以快速迭代地开发移动应用.WebView加载资源的速度并不慢,但是如果资源多了,就很慢.图片.css.js.html ...

  7. 30个深度学习库:按Python、C++、Java、JavaScript、R等10种语言分类

    30个深度学习库:按Python.C++.Java.JavaScript.R等10种语言分类 包括 Python.C++.Java.JavaScript.R.Haskell等在内的一系列编程语言的深度 ...

  8. Java和JavaScript中使用Json方法大全

    林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka   摘要:JSON(JavaScript Object Notation) 是一种轻量级的数 ...

  9. Nashorn 在JDK 8中融合Java与JavaScript之力

    从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调 ...

随机推荐

  1. codefroces 7C

    C. Line time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  2. bzoj4355 Play with sequence(吉司机线段树)题解

    题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 赋值为\(x\) \(2.\)区间\([L,R]\) 赋值为\(max(a[i] + x, 0)\) \(3.\)区间 ...

  3. HDU 4049 Tourism Planning(状压DP)题解

    题意:m个城市,n个人,让这n个人按固定顺序走遍m个城市.每个城市有一个单人票价pi.每个人在每个城市能获得vij的价值.如果多个人在同一城市,那么会额外获得价值,给出一张n * n价值表,额外价值为 ...

  4. sdutoj2887

    #include <stdio.h> #include <math.h> int main(){ int px,tx;double alpha; int T;scanf(&qu ...

  5. 网站资源被盗链的:预防方法 VS 网站资源防盗链的:破解技巧

    1 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问! 1 资源被盗链:(简明定义) 下载者不是从你的网站直接下载资源,而是通过其他盗链网站提供的你的下载资源链接进行下载你的服务 ...

  6. macOS 没有鼠标 怎么使用 快捷键

    macOS 没有鼠标 怎么使用 快捷键 mini 链接蓝牙鼠标 菜单选择 光标聚焦 上下选择 确认,选中 用键盘浏览菜单 若要使用这些快捷键,请先按下 Control-F2 或 Fn-Control- ...

  7. 最新 Markdown for GitHub教程

    Markdown 教程 Markdown 是什么? Markdown 是一种方便记忆.书写的纯文本标记语言,用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档:譬如您正在阅读的这份文档. 它 ...

  8. i18n 和 L10n (internationalization and localization) 国际化与本地化(具有全球战略眼光的公司企业的必由之路)

    i18n 和 L10n (internationalization and localization)  国际化与本地化(具有全球战略眼光的公司企业的必由之路) 1 1 https://zh.wiki ...

  9. css text-align-last & text-align

    css text-align-last & text-align css https://caniuse.com/mdn-css_properties_text-align-last http ...

  10. HTML5 Server-Sent Events

    HTML5 Server-Sent Events SSE demo https://www.w3schools.com/html/tryit.asp?filename=tryhtml5_sse htt ...