服務器_數據交互(數據傳輸格式,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 各有優勢,根據業務場景選擇合適的數據格式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章