Protobuf的大概介绍、使用和剖析

 

 

理财

第叁是指YY理财(官方概念:YY理财是友金所出产的“投资人在锁定期内对借款项目实行先期自动投资及到期退出或提前退出时事先自动转让债权”的劳动布置,是机关投标工具。),其实整个应用叫YY理财也向来不难点。

a、规则:

protobuf把音信结果message也是透过
key-value对来代表。只是在那之中的key是选取一定的算法总括出来的即通过种种message中每一个字段(fieldindex)和字段的数据类型进行演算得来的key = (index<<3)|type;

type类型的应和关系如下:

 

Type

Meaning

Used For

0

Varint

int32, int64, uint32, uint64, sint32, sint64, bool, enum

1

64-bit

fixed64, sfixed64, double

2

Length-delimited

string, bytes, embedded messages, packed repeated fields

3

Start group

groups (deprecated)

4

End group

groups (deprecated)

5

32-bit

fixed32, sfixed32, float

 

Value会依照数据类型的两样会有三种表现方式:

对此各个int,bool,enum类型,value就是Varint

对此string,bytes,message等等类型,value便是length+原始内容编码

 

Varints是一种紧凑表示数字的艺术。它用2个如故多个字节表示三个数字,值越小的数字字节数越少。相对于守旧的用4字节表示int32类型数字,Varints对于小于128的数值都得以用3个字节表示,大于128的数值会用越来越多的字节来表示,对于十分的大的数码则须要用三个字节来代表。

 

Varints算法描述:
每三个字节的参天位都是有异乎常常含义的,如若是1,则象征继续的字节也是该数字的一局部;即便是0,则停止

首页

那实际上有点像是把一个“开屏广告”做成1个标签了,仍然私下认可选中的,是否有点奢侈了。要是是针对性没有完成第②回投资的新用户幸好,但对老用户而言是还是不是能够设想换其余体现内容(例如特邀好友、激励续投和新增投资等)。毕竟首页在守旧意义上照旧很重庆大学的,当然则今不可胜计网页版成效还尚无移植到移动端,也或者还有其他作用正在开发中,先拿广告顶上吧。

二、protobuf有什么?

        Protobuf
提供了C++、java、python语言的支撑,提供了windows(proto.exe)和linux平台动态编写翻译生成proto文件对应的源文件。proto文件定义了商谈数据中的实体结构(message
,田野)

关键字message: 代表了实体结构,由四个音讯字段(田野)组成。

新闻字段(田野): 包蕴数据类型、字段名、字段规则、字段唯一标识、私下认可值

数据类型:常见的原子类型都帮忙(在FieldDescriptor::kTypeToName中有定义)

字段规则:(在FieldDescriptor::kLabelToName中定义)

        required:必须开端化字段,要是没有赋值,在多少种类化时会抛出非凡

        optional:可选字段,可以无需开始化。

        repeated:数据能够重复(也便是java 中的Array或List)

        字段唯一标识:种类化和反体系化将会动用到。

默认值:在概念新闻字段时得以给出默许值。

 

总结

一句话来说,友金所-YY理财作为一款网络经济产品,已经获得的极大的打响。在收入上丰富有吸重力,在利用上充足有亲和力(对非金融专业用户而言,不抵触,不畏难,接地气);仍有一部分细节的体会可继续优化。下一步自然是付出更好的投资项目或产品,吸引越来越多的用户。至于品牌口碑、用户忠诚度照旧得付出时间验证。

一 、protobuf在java使用的系列化流程

 

java程序调用parserFrom(byte[]
data)开头字节体系的反系列,Java程序通过调用编写翻译生类GenerateMessage中的wirteTo()方法开端将类别化后的字节写入输出流中

 葡京娱乐总站平台 1

葡京娱乐总站平台 2

GenerateMessage
继承AbstractMessage类,类别化最后在AbstractMesssage中成就,种类化的兑现进程:

a、遍历对象中Message结构()

调用AbstractMessage类中的writeTo()方法

 葡京娱乐总站平台 3

b、 类别化Message中每多个字段

调用CodeOutputStream类中的writeMessageSetExtension()方法

葡京娱乐总站平台 4

 

c、 对于Varints  Tag 的系列化流程:

调用CodeOutputStream类中的writeUInt32()方法

葡京娱乐总站平台 5

调用CodeOutputStream类中的WriteRawVarint32()方法

葡京娱乐总站平台 6

 

d、 对于非Varints Tag的系列化

调用CodeOutputStream类中的WriteTag()方法

葡京娱乐总站平台 7 

葡京娱乐总站平台 8

 

实际的类别化实现都在CodedOutputStream中形成

 

入股详情页:

安插介绍、参加记录(别的投资人的,显示实在可信赖)、其余信息、限额表达(银行卡单笔、单日限额等)等四项内容除了“别的信息”是现阶段页面实行,别的三个都是新页面,哪一种艺术更好倒霉说,内容有多有少,情势也层层(有报表、有列表、也有文件),提出保持一致

4、JSON字符串

 

{“phone”:{“phoneName”:”idol3″,”price”:2000,”top”:1},”watch”:{“watchName”:”tcl
wtch”,”top”:1,”price”:1000}}

 

用友金所理财(姑且把本身的作为称为理财吧,其实只是是用作余额宝的替代)有一年多了,最发轫用同事给推荐的,当时新用户第三回投资受益率算是挺高的,他也能得红包奖励什么的。因为老是开标金额少于,加上手提式有线电话机验证码各个流程,还不是很好抢,反倒刺激了自作者去品味(后来发觉用APP速度快一些)。尽管实习工资少的要命,但稍事多余就放在余额宝里看它天天涨一点也挺满面春风的,可后来受益率越来越低了也就没了兴致。至于股票、基金这一个,不懂也不敢碰。当时P2P还尚无后天那般臭名昭著,即便全体疑心犹豫(希望团结是幸运的),但要么在一味大概明白了操作流程后就买了部分,当然那长长的协议书现今还没读过。

Protobuf的归纳介绍、使用和分析

 

背景

友金所是用友集团旗下的互联网金融服务平台。友金所作为必要融通资金的借款方与富有闲置资金的投资方之间的阳台,帮助借贷双方方便急忙地做到投资借贷,并嘱托用友集团旗下的保管集团对借款方的信用实行查处与核实,提供有限协助。(没学过金融,但看着也像是人话)

友金所移动端安卓版望着并不难用,恐怕是因为本身是从复杂的web转过来的,以前已经对其大概功用有所了然。当然,也许钻探金融产品的易用性没有太大意思,终归用户在真的投资前线总指挥部要好好切磋一番,安全性和收益才是真的的痛点。页面结构如下:

(本身对思想导图的理念:无法为了画而画,但多少大产品觉得怎么理都理不清,所以画了大体上索性遗弃了,以至于会思疑思维导图那些工具正是个花架子。这一次重庆大学是成品简单,简单表明清晰,画的也还算完整,就贴上了。)

② 、音讯结构对应的java类(ProductInfo、PhoneInfo、沃特ch)

葡京娱乐总站平台 9

 

账户

在产品和设计看来涉及到金钱的都能归类为“账户”,用户在“账户”页面来看的也正是各类积分、红包、礼包、体验金那个内容,就如没什么可让小编批判的。除了把“安全退出”藏的有点深(看来是很想留下用户的)

关于用户停留时间和选用成效,自然不或者盲目借鉴微信的设计理学。友金所这类金融产品的营业照旧很难做的,尽管并不是严酷意义的“重运维”产品,但不运维就像是也说不过去。

那样复杂的积分系统或许对用户和筹划开发者来说都以一种负担,如何是好减法?对应用效用的提高效益就好像并相当小。

在真金白银面前,用户到底会多在意你的封官种下心愿?平日没闲钱怎么投?

葡京娱乐总站平台,什么让工薪阶层在发工钱后第暂且间想到友金所?

叁 、时间功用

透过protobuf系列化/反系列化的进程可以汲取:protobuf是由此算法生成二进制流,连串化与反种类化不须求分析相应的节点属性和剩下的叙说新闻,所以类别化和反体系化时间功用较高。

扬言:理财有危害,投资需谨慎。本文非软文。

b、demo生成的的二进制文件反体系化。

第1个字节 (0A)

字段索引(index):         0A = 0001010  0A>>3 = 001 = 1

数据类型(type):           0A = 0001010&111  = 2 (String);

 

第2个字节 (0C)

字符串长度(length):      0E = 12;

字符串:                         0A 05 69 64 6F 6C 33 10 01 18 BD 0F

 

第3个字节 (0A)

因为字符串是缘于phoneInfo属于嵌套类型

字段索引(index):         0A = 0001010  0A>>3 = 001 = 1

数据类型(type):           0A = 0001010&111  = 2 (String);

第4-9个字节(69 64 6F 6C 33)

字符串长度(length):    05 = 5

字符串:                       69 64 6F 6C 33 = idol3

 

第10个字节 (10)

字段索引(index):         10 = 000一千0    10A>>3 = 0010 = 2

数据类型(type):           10 = 000一千0&111  = 0 (Varints);

 

第11个字节  (01)

Varints:                          01 = 00001字节的万丈位为0 整数停止

Value:                            1;

 

第12个字节(18)

字段索引(index):           18 = 0001一千    18>> 00011 = 3

数据类型(type):           18 = 0001一千&111  = 0 (Varints);

 

第13个字节(D0)

最高位为1,整数总计到下叁个字节

 

第14个字节(0F)

参天位为0,整数总计甘休

Value:为11111010000 =2000

 

YY理财页:

动用卡片列表的主意体现当天的最新的未满额的投资连串(具体排序机制有待考证),有新手30天,七个月,7个月,3月多样普遍锁定期限可供选拔。有时做活动,比如跨年等也会有3月这种特殊期限。

单个卡片上显示了系列号、年化收益率、锁定期限和抢标进程等音信。分别解释一下。

序号YY-C-二零一六122104,分别代表投资类型(C代表13个月锁定期限),日期和当天的批次(有疑点),以前一天唯有两场(10点和14点)发标,现在多了三个20点的场次。可是以二零一四年10月231日为例,A型标的后两位数字已排到06,B型标排到03,C型标排到04,令人费解。所以同二个开标时间相同类别的标会开好多少个呢?建议做好“场次的分别”。其余,对于未满额的标如何处理也尚不清楚。

收益率,呵呵了,并不懂具体算法,反正也算挺高了,要是没有别的理财格局,不妨一试。

锁定期限内可脱离,但多少规章亟待领会。

抢标进程表义不明,用户率先当下不清楚,需求思想是已有照旧剩余量。

7、Protobuf的源码分析

快钱支付页:

由蓝变橙的用意何在?提示?警示?总认为像是突然换了个使用。

手提式有线电话机验证码不能自动获取?是没有落到实处此效能,照旧别的考虑,依然手提式有线电话机本身的安装难点。那样打开短信成效,找到并查看短信,在回忆或复制验证码多少是有点不便利的。

六 、protobuf的简便分析

更多

分组一:账户安全、新手指导、用户反馈、系统音讯(文告与站内信)、地址管理

分组二:帮忙中央、关于大家(集团简介、关于产品、安全保持)、关于版本(版本号与自小编批评更新)、联系大家(服务时间、地方、微信、电话)

很啰嗦啊,那是2个运用教程?照旧一个产品介绍?

建议杰出“系统音讯”,因为小编命名含糊不占优势,而且相比重庆大学,一个“红点标识”不够;其次是内容删除后,重新分类分组。

1、创建product.proto文件

        定义了五个Message(ProductInfo、PhoneInfo、Watch)音讯结构

葡京娱乐总站平台 10

③ 、protobuf有怎么着用?

       
Xml、Json是当前常用的数据沟通格式,它们一直使用字段名称尊崇体系化后类实例中字段与数码里面包车型客车投射关系,一般用字符串的款型保留在种类化后的字节流中。音信和新闻的定义相对独立,可读性较好。但连串化后的数目字节非常的大,类别化和反连串化的光阴较长,数据传输功效不高。

       
Protobuf和Xml、Json体系化的法子差异,采取了二进制字节的体系化格局,用字段索引和字段类型通过算法总计获得字段以前的关系映射,从而实现更高的光阴效能和空中功能,尤其符合对数码大小和传输速率相比较灵活的场馆使用。

C、反种类化结果

phoneinfo为

phoneName = “idol3”

top = 1

price = 2000;

 

同样的法子watchInfo为:

watchName = “tcl name”

top = 1

price=2000 

五、Protobuf与json的对比

③ 、动态编写翻译

以windows下用protoc.exe工具实现proto文件编写翻译为例,protoc.exe是用C++落成。在控制台执行命令:

葡京娱乐总站平台 11

编写翻译的流程:

自作者批评proto的语法规则

将proto的文件中的message结构转换为GenerateMessage类的子类,并贯彻Builder接口。

编写翻译流程

Main.cc中的main()方法

葡京娱乐总站平台 12

 

Command_line_interface.cc中的Run()方法

葡京娱乐总站平台 13

 

Import类中Import()

葡京娱乐总站平台 14

 

在Descriptor中完成message音信的搜集和转化。

四 、空间功能

xml、json是用字段名称来规定类实例中字段之间的独立性,所以类别化后的多寡多了许多讲述音讯,扩充了体系化后的字节体系的体积。

 

Protobuf的种类化/反体系化进程可以得出:

protobuf是由字段索引(田野同志Index)与数据类型(type)总结(田野先生Index<<3|type)得出的key维护字段之间的映照且只占三个字节,所以比较json与xml文件,protobuf的种类化字节没有过多的key与讲述符信息,所以占用空间要小很多。

② 、数据系列化/反体系化

一、protobuf是什么?

        protobuf(谷歌 Protocol
Buffers)是谷歌提供1个全数便捷的商议数据交流格式工具库(类似Json),但比较之下于Json,Protobuf有更高的转向功能,时间功用和空中功用都以JSON的3-5倍。前面将会有大致的demo对于那三种格式的数量转载功能的比较。但以此库近日选择还不是太流行,听别人讲谷歌(谷歌)之中很多成品都有应用。

 

二 、java使用protobuf 的反系列化流程分析

java程序通过调用parserFrom(byte[] data)先导反体系化

 葡京娱乐总站平台 15

葡京娱乐总站平台 16

现实在com.google.protobuf. AbstractParser类中落到实处

 

葡京娱乐总站平台 17

 

葡京娱乐总站平台 18

葡京娱乐总站平台 19

 

葡京娱乐总站平台 20

 

 

最后在com.google.protobuf.CodedInputStream类中达成反连串化

③ 、音信结构和java对象赋值

PhoneName:” idol3”

Price:2000

Top:1

 

WatchName:” tcl watch”

Price:1000

Top:1

 

1、优缺点

可取:通过上述的日子作用和空中效用,能够看到protobuf的上空作用是JSON的2-5倍,时间效用要高,对于数据大小敏感,传输成效高的模块能够应用protobuf库

 

缺点:音讯结构可读性不高,系列化后的字节体系为二进制类别无法大概的解析有效性;近期应用不广泛,只扶助java,C++和Python;

 

⑤ 、Protobuf转化后的二进制文件

葡京娱乐总站平台 21

 

空间成效

Json:107个字节

Protobuf:32个字节

 

时刻功效

Json序列化: 1ms ,  反连串化:0ms

Protobuf 序列化: 0ms 反连串化:0ms

 

将public List<Phone> list和repeated PhoneInfo phoneInfoList
=3;都赋值为一千个PhoneInfo

 

空间作用

Json:4206个字节

Protobuf:1332个字节

 

岁月效用

Json序列化: 4ms ,  反体系化:1ms

Protobuf 序列化: 1ms 反类别化:0ms

④ 、Protobuf在Android上的施用

一 、创建proto文件,定义新闻的实业结构

贰 、编写翻译proto文件生成对应的java文件

3、添加protobuf-java-2.5.0.jar到android工程

④ 、在android中贯彻对音讯结构的类别化/反种类化