当前位置: 首页 > 科技观察

ProtobufvsCBOR:新一代二进制序列化格式

时间:2023-03-12 20:30:09 科技观察

在之前的文章中,我们讲了何时使用Yaml,何时使用JSON,何时使用Protobuf:Humanwritemachineread,使用Yamlmachinewrite,humanread,machine-writteninJSON,机器可读,使用JSON或ProtobufJSON作为几乎所有语言都支持的序列化格式,已经在很多地方得到了广泛的应用。但是有一个缺点。JSON里面充满了很多大括号、方括号、双引号,导致冗余字符太多,数据量非常大。在对传输速度要求高的场景下,数据量越大,成本越高;传输带宽越大,单位时间内传输的数据越少。Protobuf是Google开发的一种二进制序列化格式。与JSON相比,Protobuf的数据非常精简,甚至没有数据的字段名。比如有这么一条数据:a={'name':'kingname','salary':99999,'address':'Shanghai','skill':['Python','crawler','Golang']}如果用Protobuf表示,数据的二进制形式如下:这种二进制数据只有值,没有字段名,所以要解析这些数据,必须在代码中加入字段名。所以需要定义一个xxx.proto文件,在里面标记各个字段的信息。任何时候在任何语言中,需要序列化和反序列化的地方,都必须提前使用protoc命令。基于这个.proto文件,生成一个xxx_pb2文件,通过从这个xxx_pb2文件中导入数据对象来处理数据。因此,我们说proto格式虽然确实简化了网络中的数据传输量,但是却给开发者增加了相当多的工作量。而最近又出现了一种新的二进制序列化格式:CBOR,它的数据比JSON小,但开发起来比Protobuf简单很多。下面我们来看一下使用CBOR对上述数据进行序列化。首先在Python中安装CBOR:python3-mpipinstallcbor2安装完成后,我们来序列化数据:importcbor2a={'name':'kingname','salary':99999,'address':'Shanghai','skill':['Python','Crawler','Golang']}result=cbor2.dumps(a)print(result)运行效果如下图所示:注意打印的数据是二进制数据,不是字符串。可以看出数据有自己的字段名,字段名和值之间会有特殊字符分隔。CBOR可以自动识别这些特殊符号来区分字段名和字段值。经过我的测试,将一个150MB的大JSON文件读入内存,然后通过CBOR重新序列化后写入文件,文件大小可以减少到60MB左右。虽然压缩率不如Protobuf,可读性不如JSON;但压缩率比JSON高,可读性比Protobuf差,几乎不增加额外的工作量。在写微服务或者网站前后端通信的时候,可以考虑试试CBOR—ConciseBinaryObjectRepresentation|概述[1]。参考文献[1]CBOR—ConciseBinaryObjectRepresentation|概览:https://cbor.io/本文转载自微信公众号《听不见的密码》,可通过以下二维码关注。转载本文请联系Code公众号。