阅读 64

protoc命令,2个excel查找相同数据

我从前言回来,有段时间没写博客了。 首先是因为工作很忙。 其次是懒惰。 前几天,竟然拿到了第一个打赏。 自己还没腌制好,就赶紧翻了身。

前几天更新了Android Studio 3.1.0,但是出现了一些问题。 还没有升级的朋友,如果不想浪费时间的话请在调整项目上稍等一下再更新。

我没找到什么特别好的话题。 因为换了电脑,找不到以前练习用的项目了。 以前断了的系列必须好好补充。 今天我们来谈谈Protobuffer。 这里不会特别详细地说吧。 官方教程已经很棒了,学习链接:

官方网站:点击打开链接(需要翻墙) )。

英语阅读困难的朋友,建议安装翻译插件。 不得不说,一些中文翻译教程很尴尬。

正文:你知道什么数据格式?

Json,XML。

问:还有别的吗?

答:……

为了避免这种尴尬的情况,我们必须了解更多的数据格式。 随着产品需求的不断变化,服务端和客户端交互的数据也会发生变化,因此交互数据的体积、扩展、维护面临着困难。 例如,Json随着版本的重复无法避免冗长的数据,不再使用的字段也不能容易地删除,体积变大,维护也变得麻烦。

我现在的项目使用的是FaceBook开源的Apollo-Graphql,但在某些方面确实非常方便,容错能力很强,感兴趣的人可以在github上看看。 他最大的特点是可以将多个网络请求组合成一个网络请求,降低每次请求的网络开销。

今天的重点是ProtoBuffer。 今天只是知识和入门级的Demo,给大家展示基本的使用方法。

首先在Android Studio上设置Protobuf:1,然后下载插件

2、在Project的build.gradle中引入Protobuf的gradle插件,并设置相关配置。

ependencies { class path ' com.Android.tools.build : grad le :3.1.0 ' class path ' com.Google.proto buf 3360 prots they belong//intheindividualmodulebuild.gradlefiles } 3、在模块中使用protobuf插件。

apply plugin : ' com.Android.application ' apply plugin 3360 ' com.Google.proto buf ' Android { . proto buf { protoc } thecodegenforlitecomesasaseparateartifactartifact=' com.Google.proto buf : protoc-gen-Java lite 33603.0 ' }.each { inmostcasesyoudon ' tneedthefulljavaoutput//ifyousetheliteoutput.remove Java } task.plugins { Java lite } } dependendendend youneedtodependontheliteruntimelibrary,notprotobuf-Java compile ' com.Google.proto buf : proto buf-lite 33603.0.0.0.0

配置完成后,创建第一个Protobuf文件。 在java文件夹的同级中,创建proto文件夹,并在proto文件夹中创建Book文件。

syntax='proto3'; option Java _ package=' com.example.John Anna.proto buf.bean '; message Book { int32 id=1; 字符串名称=2; s

tring desc = 3;}

下面来介绍一下ProtoBuf的语法:

1、syntax 指定protobuf使用的语法版本,除了proto3还有proto2,proto3是高版本,推荐使用proto3,他可以和proto2互相兼容,所以不用担心。

2、生成文件的位置,我们编写的probuf文件会生成Java文件,我们可以随意设置生成文件的位置。

3、message标识的对象,可以说是消息体,使用protobuf的最终目标是和服务端通信,所以定义的都是交互数据中的内容,所以message这个单词非常的恰当。

4、定义变量的语法:类型 + 名称 = 唯一标识。这里要多说几句:int32和string是基本类型,紧接是变量名称,“=”后面的是唯一标识,记住是唯一标识!!不是赋值操作!!!标识是为了区分是否是同一个属性,保证属性不会匹配错乱,也许你有些懵逼,但是不要紧,之后我们再聊这个话题。

最后在MainActivity中使用这个Book:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.textView); findViewById(R.id.button).setOnClickListener(this); writeBook(); } private void writeBook() { new Thread(){ @Override public void run() { BookOuterClass.Book book = BookOuterClass.Book.newBuilder() .setId(1) .setName("lzp") .setDesc("good") .build(); File file = new File(getCacheDir().getAbsolutePath() + "/cache"); if (file.exists()){ file.delete(); } try { book.writeTo(new FileOutputStream(file)); } catch (IOException e) { e.printStackTrace(); } } }.start(); } @Override public void onClick(View v) { try { File file = new File(getCacheDir() + "/cache"); BookOuterClass.Book book2 = BookOuterClass.Book.parseFrom(new FileInputStream(file)); textView.setText(book2.toString()); } catch (IOException e) { e.printStackTrace(); textView.setText("error"); } }}

Book类存在于BookOuterClass中,创建使用Builder模式,我们在启动的时候,往File文件中写入了创建的Book对象,之后点击按钮读取这个对象,模仿和服务器通信的流程。


读取成功,我们的demo运行完美~


Protobuf的优点

看了一个略微low的demo,也没看出Protobuf有什么特别流弊的东西啊?如果你觉得太简单了,这只能说明Protobuf的设计者很流弊。Protobuf的最大的特点是流量小,而且非常小……

小到什么程度呢?官方的介绍:

如果属性的标识是1到15,会使用一字节的编码,如果是16到2047,则会使用两个字节编码。

在数据传输的时候,实际上传递的是一个个的数字编码,传输方负责把对象进行编码,接收方负责把对象进行解码,为了防止属性的编解码不一致,所以使用了唯一标识。

很遗憾,这里不能具体的感受到到底这个编解码的过程,大家可以到官网上查看编码的具体思想,你将会大吃一惊。

当然Protobuff还有很强的扩展性,其他的特性大家就自己去研究发现吧。


总结

今天我们了解了Protobuf,在数据格式方面又有了新的学习,Protobuf最大的特点就是数据体积小,如果是对流量要求非常高的话,一定要考虑一下。

ok,今天的内容就结束了,有什么问题,大家一起留言讨论,拜拜~


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐