结构化数据传输协议:json与protobuf

2019-10-31  本文已影响0人  镜中无我

跨平台的结构化数据传输协议一般情况下关注三要素和三件事:

  1. protocal
  2. 数据
  3. API
  1. 协议编译
  2. 序列化
  3. 反序列化

以下三种协议按照以上要素进行介绍

json(javascript object notation)

  1. protocal:面向javascript,使用eval()自动转换成远程的对象,面向其他语言需要自己编写model并解析
  2. 数据:包含多种数据类型,对象(字典表示法),数组(同质化元素集合),string(基本类型,可以用来作为键或者值),nil(空)等
  3. API:引入json的包,可以提供建立json对象,读入(从网络或者本地)json数据,写出(网络或者本地)json数据的接口,并且提供显式类型转换的接口
  1. 协议编译:不经过特殊编译,除非针对特定语言产生了特定的转换接口,传输的是文本数据,所以是自描述型的,发送方和接收方事先约定好传输数据的格式
    2 序列化:发送方将对象数据手动写入json对象中,由json库自动完成序列化工作
    3 反序列化:接受方读出json数据,然后使用json接口获取相应数据写入对象
  1. 因为拥有自描述性,并且以文本方式传输数据,所以可扩展,可编辑
  2. 拥有良好的跨平台和跨语言特性(提供不同的库)
  3. 使用范围较广,支持的应用场景较为丰富,灵活的语法可以传输更广泛的数据
  4. 文本传输,没有经过压缩,并且带有一定的格式扩展,效率比XML优,比protobuf差

注意:不同的json库对数据的处理方式不一样,cjson采用深度拷贝的方式,所以记得销毁数据,而在某些优化场景下是采用浅层拷贝的方式,此时记得考虑数据变动的协同性。

protobuf的概念

  1. 协议:编写proto文件,类似于java和c++的类定义,但是更具有通用性(提供各种面向语言的编译库),并且采用编号预处理
  2. 数据:提供更加丰富的数据类型,基本可以和高级语言一一对应
  3. API: 根据平台提供各种数据处理的api,同时根据proto文件产生特定的api
  1. 协议编译:编写proto文件,编译器自动编译,产生特定语言的类型
  2. 序列化:一切建立在proto生成的类型之上,建立对象,采用数组形式或者api方式写入数据,由库直接序列化成二进制文件,所以相关数据不可编辑;
  3. 反序列化:读入对象,直接使用(良好的类型匹配)

protobuf的特性

protobuf的语法

}
最后proto文件会被编译成相应语言的二进制文件

数据类型的对应

image.png

序列化和反序列化本身不关注数据的传输,但是网络传输的时候,只有拿到整个序列化后的数据,才能解析出对象,所以需要设计协议包括:header(根据不同的对象封装相应的规则,proto),主体

image.png image.png

protobuf的不足

高级技术

动态编译
关于性能的一些细节

references
google官方文档

上一篇 下一篇

猜你喜欢

热点阅读