一文搞懂XML、Json、Protobuf序列化协议

12 篇文章 0 订阅
3 篇文章 0 订阅

网络传输协议,简称为传送协议(Communications Protocol),是指计算机通信的共用语言。目前最为普遍的计算机通信为网络通信,因此“传送协议”一般是指计算机通信的传送协议,比如TCP/IP等。然而,传送协议也存在计算机的其他形式通信,例如:面向对象编程里面对象之间的通信;操作系统内不同进程之间的通信,都需要一个传送协议,以确保通信双方能够正常交流!常用的网络传输数据格式有:xml、json、protobuf等。

 一、为什么需要序列化和反序列?

  name姓名,如:Mike
age年龄,如:34
languages熟悉的编程语言,如:C++、JAVA、Go,数组格式,如:["C++","Linux"]
phone电话号码,是嵌套的对象,包含number和type,如:"number":"18337627326","type":"home"
books对象数组方式,可以包含多本书信息,每本书包含name和price属性
vip是否为vip会员,如:true,false
address地址,如:"广东省深圳市"

网络传输通常需要传输这样一个对象,里面的变量有些是数组的形式(language),有些可能是对象(phone),甚至有些是数组对象(books)。

 此时我们需要将对象从客户端传输到服务器,那应该怎么传输呢?定义一个person对象,在描述完成员变量,将这个对象占用的内存发送给服务器?比如:

//Client伪代码
Person per;
封装per;
send(fd,&per,sizeof(per));

//Server伪代码
recv(sockfd,buf,1024);

我们知道所定义的苏家结构对于计算机来说都是二进制的字节而已,在网络传输的过程也是以字节流形式进程传输。Linux系统中,在send函数per被强制转换为void*,第二个参数类型为const void*,在recv函数中获取buf,并且强制转换为Person类型,最终得到想要的结果。这里面涉及到将per对象转换为void*,是发送前的序列化操作;将接收到的buf转换为Person类型是反序列化操作。

这样子行不行?

答案是:肯定不行了!比如language可能是“c++”,也可能是“Go”,此时我们sizeof(per)是固定还是不固定?假如不固定,那服务器怎么解析出一个Person类来?

既然不能直接传输对象,那怎么办?这时候序列化协议就发挥作用了。

二、序列化和反序列化基础

 1、序列化和反序列的概念

  • 序列化:将对象转换为字节序列的过程称为对象的序列化;
  • 反序列化:将字节序列恢复为对象的过程称为对象的反序列化;

 2、什么情况下序列化?

  • 当你想要把内存中的对象状态保存到一个文件中或者数据库中的时候;
  • 当你想要用套接字在网络上传送对象的时候;

3、如何实现序列化? 

主流序列化协议:xml、json、protobuf

4、xml/json/protobuf序列化结果

(1)xml序列化结果

 (2)json序列化结果

 (3)protobuf序列化结果

 

三、XML简介

 xml是一种通用和轻量级的数据交换格式语言,是指可扩展标记语言(extensible  markup language),以文本结构进行存储。它可以用来标记数据、定义数据类型,提供统一的方法来描述和交换,而且独立于程序语言或供应商的结构化数据。xml有丰富的编码工具,比如DOM、SAX等。xml的解析方式有两种:

  1. 以文档模式进行解析,也就是通过父标签索引出一组标记。比如:xmlData.getElementsByTagName("tagName");
  2. 遍历及诶单(document以及childNodes),可以通过递归的方式。
优点(1)文本结构存储;
缺点

(1)xml格式存储的数据比其它的占用更多的空间,因为它除了保存原始数据,还需要保存元数据的描述;

(2)格式转换问题,比如给定一个doc做数据交互,需要先确定doc怎么编码,才可以用xml描述并还原;

 三、Json、Protobuf简介

为了提供一种比xml更加轻量化的方式来进行系统间的通信,json和protobuf应运而生!

1、Json

Json是一种通用和轻量级的数据交换格式,也是以文本的结构进行存储,是一种简单的消息格式,全称为JavaScript Object Notation。Json作为数据包格式传输时具有更高的效率,这是因为Json不像xml那样需要有严格的闭合标签,这就让有效数据量与总数据包比有着显著的提升,从而减少同等数据流量的情况下网络的传输压力!

2、Protobuf

Protobuf是Google开发的一种独立和轻量级的数据交换格式,以二进制结构进行存储,用于不同服务之间序列化数据。全称为Protocol Buffers,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者序列化,可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

Protobuf的原理:二进制数据流

优点

(1)二进制结构存储,效率高,序列化体积比Json和xml更小、更加灵活;

(2)格式规范,支持RPC;

(3)易于使用,开发人员可以按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持JAVA、C++、Go等语言环境。通过这类类包含在项目当中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列工作;

缺点

(1)可读性不高;

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Unity中的protobuf序列化是一种将数据结构转化为字节流的方法,以便在网络传输、存储或在不同平台之间传递数据。它基于Google的protobuf (Protocol Buffers)协议,能够高效地序列化和反序列化复杂的数据结构。 在Unity中使用protobuf序列化需要进行以下几个步骤: 1. 定义消息结构:首先需要在.proto文件中定义要序列化的数据结构。这包括定义消息的字段、枚举、嵌套消息等。可以指定每个字段的类型(整数、浮点数、字符串等)和标签(用于标识字段的唯一性)等信息。 2. 编译.proto文件:使用protobuf编译器将.proto文件编译为相应语言的代码。在Unity中可以使用Protobuf-net等第三方插件来生成C#代码。 3. 序列化数据:在需要序列化数据的地方,将数据按照定义好的消息结构进行赋值,并使用protobuf提供的方法将其序列化为字节流。 4. 反序列化数据:在接收端或需要解析数据的地方,使用protobuf提供的方法将字节流反序列化为消息对象,然后可以通过读取字段的方式获取其中的数据。 使用unity protobuf序列化的好处是: 1. 空间效率高:protobuf采用二进制格式进行序列化,可以将数据压缩为较小的字节流,减少网络传输和存储的空间成本。 2. 速度快:protobuf序列化和反序列化速度较快,可以更有效地处理大量的数据。 3. 跨平台兼容性好:使用protobuf序列化后的数据可以在不同平台、不同语言之间共享和传输,无需担心兼容性问题。 总之,Unity中的protobuf序列化是一种在网络传输和数据存储中高效、方便的数据序列化方法,可以帮助开发者更好地处理数据结构和跨平台数据传输的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上的追梦人

您的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值