服务器_数据交互(数据传输格式,JSON,XML,Google Protocol Buffer)

网络层建立了客户端和服务器的连接之后,就可以传输数据。传输数据的时候,为了双方都可以识别,需要拟定一个双方都能解析的数据格式(就像讲话的使用同一语言)

数据传输格式

建立网络连接之后,客户端和服务器就可以通过数据传输,从物理本质上来说,网络传输其实是通过一系列的线路,经过电路调整变化,依据网络传输协议进行通信的过程。
数据传输特点:

网络数据大小
网络数据的大小影响带宽的占用,当服务器承受高并发的数据传输时,网络流量会达到峰值(过大会占满带宽),影响服务器的使用效率和用户体验,所以数据传输过程中,应尽量减少冗余数据,节省带宽,提高传输效率。

网络数据安全性
客户端和服务器交互的大多数数据都是对外界隐藏的,所以网络传输过程中的选择数据格式要考虑数据安全。

实现复杂度
数据传输过程中,需要对信息进行序列化和反序列化 ,实际开发中也要注意数据结构的可扩展性和可维护性。

协议通用性
通常情况下,客户端和服务器处于不同的运行环境下,因此需要传输的数据具备跨平台的特性,能够实现同步平台之间的跨平台通信,而不局限于同种平台之间的数据传输。

数据类型

  • 自定义二进制 :最直接的数据传输格式,信息体积小,但缺少易读性和易写性,自定义二进制传输需要服务器和客户端自己定义消息格式,并自己实现序列化和反序列化的方式和容错处理等,可扩展性也不强,很难得到广泛应用,但自由度很高。

  • 开源协议:最常见的协议库:JSON,SML,Google的Protobuffer及Facebook的Thrift。这些开源库基本都提供了序列化和反序列化的库,在扩展性和容错处理方面也很不错。Protobuffer和Thrift是比JSON,XML,Binary体积更小,效率高,使用方便,支持语言更多,更高级的开源协议等。

  • 文本化协议 : 数据传输也可以直接使用文本格式,按照一定的协议标准组织结构进行传输,如JSON,XML等,通过使用这些开源库,实现文本数据的序列化和反序列化。文本文件的数据大小更大,但是可视化好,容易维护和调试。

JSON

JSON(JavaScript Object Notation,Javascript对象)是一种轻量级数据交换格式,完全独立于编程语言的文本格式,对众多语言友好。

JSON语法

  1. 数据都是以键值对的形式表示,用冒号隔开
  2. 数据之间用逗号隔开
  3. 大括号保存JSON对象,对象内可有多个键值对
  4. 中括号保存JSON数组,数组内可有多个对象

JAVA中的JSON解析
JSON官网给出多种JSON构造和解析工具:org.json,Json-lib。开源库中有Google的Gson,阿里的Fastjson

1,Json-lib

  1. 使用Json-lib需要导入net.sf.json.* 包
  2. 系列化:使用JSONObject的fromObject对象而可将JavaBean对象转换为JSONObject对象。
  3. 反序列化: JSONObject的 toBean方法可将JSONObject对象转换为JavaBean对象。若对象中含有复杂子对象,如List或者自定义JavaBean,需要使用classMap才能成功转换。

2,Gson
4. 创建Gson对象
5. 序列化:toJson方法将Javabean转换为Json字符串
6. 反序列化:fromJson方法把Json字符串转换为Javabean对象

3,Jackson

  1. 创建ObjectMapper对象
  2. 序列化:调用writeValueAsString将JavaBean转换为Json字符串
  3. 反序列化:调用readValue或readTree可将JavaBean读取到JsonNode或Map中。

4,Fastjson

  1. Fastjson可以使用com.alibaba.fastjson.JSONl类实现对json的操作。
  2. 序列化: JSON.toJSONString将JavaBean转化为Json字符串
  3. 反序列化:paseObject将Json字符串转换为JavaBean

总结
速度:Fastjson > Gson > Jackson > Json-lib

XML

Extensible Markup Language ,可扩展标记语言,常用的 数据交互格式,也能对具结构性的文件进行标记,可以对文档和数据进行结构化处理,从而使得各个组件之间交换数据,实现动态内容生成,企业集成和应用开发。通过XML,我们可以更准确地搜索,更方便地传输数据,更好地描述一些事物,传输或存储数据。

特征

  • 可标记扩展语言
  • 可标记性语言
  • 宗旨是传输数据
  • 需要自定义标签
  • 具有自我描述性

数据共享
XML数据通过纯文本的形式进行存储,独立于硬件或者软件的存储方式,使得数据共享更容易。

数据传输
XML可以很容易地在不同的操作系统间交换数据,通过各种不兼容的应用程序之间读取数据,降低数据交换复杂性。

平台兼容
升级新的系统需要转换很多数据,往往丢失不兼容的数据,而XML数据以文本格式存储,可以在不损失数据的情况下,更容易扩展升级到新系统,应用程序或者浏览器。

JSON与XML

  • 可读性:两者不相上下,JSON的简便语法和XML的规范标签都是很好的可读性。
  • 可扩展性:XML更好。
  • 编码难度: 两者都用很多编码工具,在无工具的条件下,XML会有更多的字符解析,JSON也可以很好地解析,但JSON更容易编码
  • 可替代性:两者不可取代,
    • XML有更好的结构描述能力,在对数据结构有严格要求的场景下,先考虑XML
    • XML 有更通用性,服务端和客户端的通信通用的是XML,服务端有时也会对JSON不能很好地编码。

Java中的XML解析
XML的解析更复杂些,选择最适合的第三方支持的解析库,选择最佳的方式可以提高解析效率。

  • 使用Java自带的Marshaller和Unmarshaller
    • Javabean to XML
      • Marshaller类能使客户端应用程序将Java内容树转换回XML
    • XML to Javabean
      • Unmarshaller类使得客户端应用程序吧XML转换为Java内容对象树
  • DOM(基于XML文档树结构的解析)
    • DOM解析XML需要Document获取XML文档中所有的Node然后遍历Node读取XML文档。
  • SAX(基于事件流的解析)
    • 通过SAXParser的parse方法解析从XML文件读取的InputStream流来读取,同时绑定一个继承自DelaultHandler的XML解析处理类,并在其中实现解析打印的方法。
  • DOM4J
    • 一款优秀的Java XML API 开源软件,性能优异,功能强大,极易使用。
    • 通过SAXReader解析,类似于DOM解析,也是通过Document对象获取所有的Element的,并通过Element对象获取结点的相关信息。
  • JDOM
    • JDOM的出现减少了DOM,SAX的编码量,减少了代码量,适合功能简单,如解析,创建等需求。在底层还是用SAX, DOM,Xanan文档。
    • JDOM也是使用Document遍历所有的Element元素来获取具体结点的信息。

Google Protocol Buffer

一款开源数据交换格式,独立于语言,平台,Google对其提供多种语言的实现,采用二进制传输数据,体积更小但是可读性没有JSON,XML好,但有较好的跨平台兼容性。
常用于分布式系统数据交换,网络传输,数据存储等。

语法

  1. 标识符
    Protobuffe协议的标识符为message或enum,message代表的是消息类型,enum代表枚举类型,在通过Protobuffer的编译器编译之后,都生成java中的一个类

  2. 修饰符
    协议字段格式 : role type name = tag[ default value]
    其中 role 有三个取值

    • required :字段不能为空,否则message不能被正确初始化
    • optional :该字段可以为空,不管该字段是否传值,message都能被正确初始化
    • repeated: 重复字段,等同动态数组,编译成Java后为List,其中数据可以为空
  3. 数据类型
    Protobuffer中的数据类型与Java中的数据类型的对照关系

    Proto TypeJava Type
    doubledouble
    floatfloat
    int32int
    int64long
    uint32int
    uint64long
    sint32int
    sint64long
    fixed32int
    fixed64long
    sfixed32int
    sfixed64long
    boolboolean
    stringstring
    bytesbytestring
  4. Option
    用于制定一些常用项:如

    • java_package: 指定java 文件的包名,输出到指定的目录下
    • java_outer_classname:指定Java文件的类型
    • optimize_for : 它的值为SPEED(缺省条件,生成代码效率高,代码占用空间大),CODE_SIZE(生成代码占用空间小,效率低)或者,LITE_RUNTIME(生成代码效率高,占用空间小,反射功能较弱)

生成Java类

  • 编辑Java文件需要使用proto.ext编译器,使用cmd窗口进行编译
  • 使用protc.exe编译的步骤可以交给Eclipse 的protobuf-dt插件完成

分析

Proto Buffer 不仅数据体积小,使用起来很方便,只要双方协定好相同的proto文件,可以生成不同语言对应的类,即可通过Builder构建Protobuf对象,在序列化和反序列化中都可以通过Builder进行。他便捷易扩展易开发,称为越来越热门的数据交换格式,针对序列化,文件流,网络流等提供使用的功能。

总结

服务端和客户端的数据交换格式:JSON,XML,Protocol Buffer 各有优势,根据业务场景选择合适的数据格式。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值