服务器_数据交互(数据传输格式,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 Type Java Type
    double double
    float float
    int32 int
    int64 long
    uint32 int
    uint64 long
    sint32 int
    sint64 long
    fixed32 int
    fixed64 long
    sfixed32 int
    sfixed64 long
    bool boolean
    string string
    bytes bytestring
  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 各有优势,根据业务场景选择合适的数据格式。

你可能感兴趣的:(服务器学习)