12

如果 JSON 也不满足你对数据传输体积的要求,还可以考虑一下 protobuf

 3 years ago
source link: http://www.swiftcafe.io/post/protobuffer
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

如果 JSON 也不满足你对数据传输体积的要求,还可以考虑一下 protobuf

如果 JSON 也不满足你对数据传输体积的要求,还可以考虑一下 protobuf

swift 发布于 2020年12月21日 数据传输格式

如果你在开发一款 APP,就免不了要读取服务端的数据。 现在大家比较流行的做法是使用 JSON 作为数据传输格式。 JSON 的好处是数据结构清晰,并且可读性强。相比 XML 数据的体量要小很多。

正是这么多的优点,让 JSON 几乎成为了现在数据传输格式的标配。

接下来我们进入正题,说说我们这次要介绍的 protobuf。 既然 JSON 那么多优点,为什么还要出来个 protobuf 呢? 虽然 JSON 的数据体量已经比较小了,但它的整体文本结构还是纯文本形式的。也就是说在传输数据的时候,会一并把数据的组织格式也进行传输。比如:

{
"name" : "swift",
"age" : 23
}

上面是一个简单的 JSON 对象。 虽然这个数据的格式已经很简单了,但它依然把属性名称,比如 name 和 age, 以及大括号,引号这些用于表示数据格式的信息也进行传输了。

当然,如果你对 APP 的网络传输没那么高的要求,这也不成问题。 但如果有一天你想提升你 APP 的传输性能了,那么 protobuf 就是你可以采纳的解决方案之一了。

protobuf

protobuf 的全称是 Protocol Buffer。 protobuf 的主要特性就是二进制传输,并且它只传输"数据",不会传输数据的"格式"。要使用 protobuf, 首先要定义数据的格式, 通过一个扩展名为 .proto 的文件来定义:

syntax = "proto3";

message Person {
string name = 1;
int32 age = 2;
}

这个 proto 文件看起来应该很熟悉。 第一行 syntax 定义了这个文件的语法格式。 因为 protobuf 有 2 和 3 两个主流版本,这里指定当前文件用的是哪个版本。

接下来就是消息格式的定义了,显而易见,我们定义了 Person 类型,有两个属性 name 和 age。 分别是 string 和 int32 类型。

协议格式定义好之后,用 protobuf 自带的命令可以将协议文件转换成 objective-c 的类文件:

$ protoc ./person.proto --objc_out ./

上面这个命令是把当前目录的 person.proto 文件,转换成 objc 类,然后输出到当前目录。成功运行命令后, 我们就会看到两个生成的代码文件了,把它们添加到 XCode 工程中即可。

1f9gqf7cj51605dx.png

然后我们就可以在代码中直接使用 Person 类来进行数据交互了:

Person *person = [[Person alloc] init];
person.name = @"swift";
person.age = 22;

NSData *dataWillSend = [person data];

这里可以看到, Person 类的属性和我们之前在 person.proto 中定义的完全一样,它还提供了一个 data 方法,将数据直接序列化成 NSData, 这样我们在发送请求的时候,直接发送这个 NSData 就可以了。

如果是从服务端接收的请求返回, Person 类同样提供了解析数据的方法:

[Person parseFromData:dataWillReceived error:nil];

这样,我们的数据传输就真正做到了只发送数据本身,而不发送数据的格式了。因为数据的格式和解析规则都保留在客户端和服务端本地了。

总结

protobuf 给我们提供的就是这样一个更高效的数据传输协议。它自然有利有弊。 好处就是我们前面说的,让数据的传输效率最大化。相比 JSON 数据格式,它的数据传输体积更小。它只传输数据本身,不会传输格式信息。

但同样,它也有一些不便,比如 .proto 数据格式文件必须同时在客户端和服务端保存。 如果数据格式发生变化,两边同时调整的代价就会比较大。

总的来说,protobuf 给我们提供了一个新的选择,如果你的 APP 已经到了需要非常细致的优化性能的时候,那么 protobuf 也是一个不错的方案。 关于 protobuf 更详细完整的文档,大家可以参考它的 Github 主页: https://github.com/google/protobuf

如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~

本站文章均为原创内容,如需转载请注明出处,谢谢。
qrcode.jpg 关注微信公众号
发现更多精彩
swift-cafe


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK