持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
在程序编写中,我们不仅仅是单进程的形式,通常,我们也需要传输数据,这个时候,数据格式的定义对于双方来说,就十分重要了,不可能说,A定义了一种数据格式,B定义了另一种数据格式,然后双方进行通信
下面,来简单介绍一下几种数据传输格式
XML传输
XML是一种标记式语义
类似于这种
<note>
<to>tiki</to>
<from>nick</from>
<heading>Reminder</heading>
<body>你好,我来自未来!</body>
</note>
这是一种语义化的标签,通过标签来构建起一颗树形结构的数据
对于这种格式,在Web早期(当前,现在也还有人在用),和安卓写页面布局时就有相关的用途
特点是语义化了标签,只要可以解析出xml标记,和内容,就可以知道传输的数据
比较不好的点是不一定适合网络传输,因为这个本质上是基于字符的,并且由于开始标记和结束标记等
占用的字符还比较庞大,若是一个几kb的xml平凡在网页上传输,不见得是一件好事,至少有更好的选择
JSON传输
JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
JSON是比XML更简洁,并且JavaScript支持友好的一种语义(因为本来就和它有关系)
JSON形如这种形式
{
"name": "John Doe",
"age": 18,
"address":
{
"country" : "china",
"zip-code": "10000"
}
}
JSON的传输格式决定了,他不想XML那样,拥有更多的语义化的能力,更像是一种描述对象和值的关系的东西。
关注的点就在于我们的传输上的话,我们的JSON会比XML传输的更快一些,并且由于是支持Javascript友好的,在web上传输数据,现在这个也算一个主流(当然,你要服务端渲染,把内容渲染完发给客户端,也不是不行)
二进制格式传输
字符流终归还是字符流,对我们友好的,对机器可不一定友好,那么,有没有一种,跨语言的解决方案来进行进程间的通信的呢?
这儿的进程不一定是本机之间的,也有可能是网络之间的通信,对于这一种情况的话。
我们可以自己编码解码操作,用二进制序列化的方式,来进行存储和发送数据
举个例子 protobuf是一种Google的传输格式
message Msg {
optional int32 id = 1;
optional int32 state = 2;
}
一般在RPC(远程过程调用)中会使用其作为编码
其优势在于什么呢?
- 调用量大,传输数据多
- 低延迟,或者须频繁处理
- 更少的网络带宽;
- 更快的解析速度。
这种方式就完全舍弃了语义化的部分,完全交给我们的机器的解码编码
对传输数据的带宽来说,其实是更友好了。