常用序列化协议总结

最近做一个终端5.0平台,里面使用了一些序列化的协议,比如xml,json,protobuf;有些地方使用感觉蛮不错,有些地方使用有些不合适,并且发现很多开源都在广泛使用序列化协议,这已经是一个基本的必备技能,于是我就想总结一下,为以后架构设计选择做铺垫;

    什么是有序列化协议呢?序列化协议是数据载体的标准定义,使装载的数据可以在不同平台使用不同语言与具体数据进行有效的无损转化,协议本身与平台和语言无关;常用序列化协议有xml、json、protobuf;虽然现在网上大量这样相关资料,我也推荐一下;xml学习——http://www.w3school.com.cn/xml/;json学习——http://baike.baidu.com/link?url=RPylyGvvLzAvxPqV64EpE33WMnvRpsvZv-aPEdKBnFAfeyLuSZ1P02PpRM-oa5b1SBT1FX2H2ut1ie8lyP-7d_、http://www.bejson.com/;protobuf学习——http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/、http://www.searchtb.com/2012/09/protocol-buffers.html;

    为什么要使用序列化协议?因为现在的应用都是要使用不同语言跨平台跨网络进行通信,那么怎么样使得数据交互过程中无损有效的交互就是必须要考虑的因素,而序列化协议就是为了解决这个问题而生;

    选择序列化协议的时候我们应该考虑哪些因素?虽然序列化协议各有优劣,但是总体而言主要考虑以下几点:

<1>可读性;比如xml、json可读性就不错,protobuf序列化的数据基本不可读;

<2>空间占用;比如protobuf序列化的空间占用是java 序列化的1/9;json格式是java序列化的1/2.6;xml相比于java序列化来说,空间占用上有点优势,但不明显;

<3>序列化以及反序列化的响应时间;比如protobuf一次操作在1us左右,比java序列化时间快一个数量级;json格式一次操作在5us左右,与java序列化时间差不多,稍快;xml格式一次操作在100us左右,比java序列化时间慢一个数量级;

<4>表达数据的复杂性;我认为xml比json和protobuf更加能表达复杂数据一些;因为xml还有属性的概念;

<5>语言支持;protobuf原生支持——java、python、c++;json和xml基本都支持,因为也比较简单;

<6>扩展性;我认为protobuf的版本前向扩展性比json和xml要好,因为有专门的required、optional进行版本前向兼容;

具体参数比较参照:http://blog.csdn.net/kongls08/article/details/8562280;

     这些序列化协议开源引擎总结:

<1>protobuf——Google Protocol Buffer;下载路径http://code.google.com/p/protobuf/downloads/list

<2>json——c++语言使用jsoncpp;下载路径http://www.oschina.net/p/jsoncpp

java语言使用jackson;下载路径http://www.oschina.net/p/jackson

c语言使用jansson;下载路径http://www.oschina.net/p/jansson

(注意:janson有些接口使用产生的内存要用户去释放,否则会有内存泄露)

其余可以参照http://www.oschina.net/project/tag/228/json

<3>xml——c/c++语言使用TinyXml;下载路径http://www.oschina.net/p/tinyxml

java语言使用xml-utilities;下载路径http://www.oschina.net/p/xml-utilities

使用场景:

     <1>protobuf——protobuf的优点是占用空间小,序列化反序列化快;缺点是可读性不行;而网络之间数据通信数据越少越好,响应速度越快越好;反而对这个可读性要求不高;所以我认为用于跨网络之间数据通信比较合适;

<2>json——json的优点是可读性比xml稍差比protobuf好,空间和速度比protobuf差,比xml好;而局域网和同机器不同系统之间通信对性能要求不是特别高,对可读性有一定要求,这样可以方便调试;所以我任务用于局域网和同机器不同系统之间通信比较合适,或者跨语言接口数据封装;

<3>xml——xml的优点是可读性不错,非常符合人类思维;但是效率不好;而存储的数据对可读性要求比较高,对效率不高,因为不会经常读写;所以我认为xml用于数据存储比较合适;

那系统内部模块之间通信是否需要使用序列化协议装载数据呢?     在我们的5.0终端的设计中,模块之间通信也是选择protobuf进行的通讯,系统内部数据都是通过protobuf定义的;带来的麻烦是数据结构的定义很麻烦,增加了数据转换的开销;带来的好处暂时没有发现,只是为了预防后续数据结构的扩展;我个人表示这个是不合理的;因为这个明显带来了麻烦,而预防的后续数据扩展在系统内部模块要求不高,通过合理设计数据结构就可以满足;但是我们也发现有些开源数据格式的组装也是使用序列化协议的,比如xmlrpc使用xml封装数据,并使用HTTP协议作为传送机制,实现远程调用;这是为什么呢?因为这个是基础组件,有可能跨语言、跨平台进行远程调用;

所以我们使用序列化协议的时候要考虑一下几点:

<1>是否有可能跨语言;

<2>是否有可能跨平台;

     最后总结:不要任何地方都使用序列化协议装载数据,要根据情况选择合适的序列化协议;

时间: 2024-08-28 19:58:50

常用序列化协议总结的相关文章

hessian原理解析三(序列化协议)

1.序列化 序列化:将数据结构或对象转换成二进制串的过程 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程 目的:保存对象状态或用于网络传输 2.hessian 序列化协议 1.0 参考官方文档:http://hessian.caucho.com/doc/hessian-1.0-spec.xtp 9 primitive types boolean 32-bit int 64-bit long 64-bit double 64-bit date UTF8-encoded st

服务器租用---常用网络协议:TCP和UDP的区别简析

服务器租用---常用网络协议:TCP和UDP的区别简析及TCP与UDP区别 TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立 一个TCP连接,之后才能传输数据.TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一 端传到另一端. UDP---用户数据报协议,是一个简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的 数据报发送出去,但是并不能保证它们能到达目的地.由于UDP在传输数据报

常用音频协议介绍&amp;&amp;有关音频编码的知识与技术参数

(转载)常用音频协议介绍 会议电视常用音频协议介绍及对比白皮书 一.数字化音频原理:声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线.通常人耳可以听到的频率在20Hz到20KHz的声波称为为可听声,低于20Hz的成为次声,高于20KHz的为超声,多媒体技术中只研究可听声部分. 可听声中,话音信号的频段在80Hz到3400Hz之间,音乐信号的频段在20Hz-20kHz之间,语音(话音)和音乐是多媒体技术重点处理的对象. 由于模拟声音在时间上是连续的,麦克风采集

ProtoBuf 常用序列化/反序列化API 转

http://blog.csdn.net/sealyao/article/details/6940245 1.C数组的序列化和反序列化API [cpp] view plaincopy //C数组的序列化和序列化API bool ParseFromArray(const void* data, int size); bool SerializeToArray(void* data, int size) const; //使用 void set_people() { wp.set_name("sea

Hessian 2.0 序列化协议 - Hessian 2.0 Serialization Protocol 翻译

Hessian是一种轻量.快速的web协议,在微服务场景下经常被使用. Hessian协议实际上包含两种含义: 1. Web网络通信远程调用服务,具体可以参考:http://hessian.caucho.com/doc/hessian-ws.html 2. 数据序列化协议,即本篇文章的内容,原文来自于:http://hessian.caucho.com/doc/hessian-serialization.html Hessian的Web通讯协议中实际上包含了Hessian序列化的内容,但Hess

一文彻底理解Redis序列化协议,你也可以编写Redis客户端

前提 最近学习Netty的时候想做一个基于Redis服务协议的编码解码模块,过程中顺便阅读了Redis服务序列化协议RESP,结合自己的理解对文档进行了翻译并且简单实现了RESP基于Java语言的解析.编写本文的使用使用的JDK版本为[8+]. RESP简介 Redis客户端与Redis服务端基于一个称作RESP的协议进行通信,RESP全称为Redis Serialization Protocol,也就是Redis序列化协议.虽然RESP为Redis设计,但是它也可以应用在其他客户端-服务端(C

Modbus常用功能码协议详解

Modbus常用功能码协议详解 01H-读线圈状态 1)描述:读从机线圈寄存器,位操作,可读单个或者多个: 2)发送指令: 假设从机地址位0x01,寄存器开始地址0x0023,寄存器结束抵制0x0038,总共读取21个线圈.协议图如下:  3)响应: 返回数据的每一位对应线圈状态,1-ON,0-OFF,如下图:  上表中data1表示0x0023-0x002a的线圈状态,data1的最低位代表最低地址的线圈状态,可以理解为小端模式: data2表示地址0x002b-0x0033的线圈状态,如下表

常用VPN协议

虚拟专用网(英语:Virtual Private Network,简称VPN),是一种常用于连接中.大型企业或团体与团体间的私人网络的通讯方法.虚拟私人网络的讯息透过公用的网络架构(例如:互联网)来传送内联网的网络讯息.它利用已加密的通道协议(Tunneling Protocol)来达到保密.发送端认证.消息准确性等私人消息安全效果.这种技术可以用不安全的网络(例如:互联网)来发送可靠.安全的消息.需要注意的是,加密消息与否是可以控制的.没有加密的虚拟专用网消息依然有被窃取的危险.常用的虚拟专用

常用应用层协议HTTP、RTSP、RTMP比较

HTTP(超文本传输协议).RTSP(Real Time Streaming Protocol实时流传输协议).RTMP(Routing Table Maintenance Protocol路由选择表维护协议)是应用层协议,理论上都可以做直播.点播,实际上直播多采用RTMP和RTSP.点播则多用RTSP和HTTP. 一.常用领域: HTTP(HTTPS)所有数据都作为文本处理,广泛应用于网络访问,是公有协议,有专门机构维护. RTSP流媒体协议,多用在监控领域视频直播点播:是公有协议,有专门机构