数据在不同进程中传输的形式

113 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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(远程过程调用)中会使用其作为编码

其优势在于什么呢?

  1. 调用量大,传输数据多
  2. 低延迟,或者须频繁处理
  • 更少的网络带宽;
  • 更快的解析速度。

这种方式就完全舍弃了语义化的部分,完全交给我们的机器的解码编码

对传输数据的带宽来说,其实是更友好了。