Like Share Discussion Bookmark Smile

J.J. Huang   2023-01-17   天堂私服 10.XML分析/教學   瀏覽次數:次   DMCA.com Protection Status

天堂私服 | JAXB 基礎

章節用意

核心中有使用JAXBXML進行解組並使用,在進行更進一步的分析時,需要先了解JAXB的基礎使用。
此章節將會介紹如何使用JAXBXML進行解組(unmarshal),也會額外做編組(marshal)的部份。

核心版本

  • L1J-3.80c

分析

  • 於核心中可以找到data/xml/Cycle/BossCycle.xml,其用途為設定Boss的循環重生設定。
  • 在進一步搜尋可以找到src/l1j/server/server/model/L1BossCycle.java是解組該xml的主要程式。
  • 可見下圖,左方import所使用的即是JAXB,右方為使用的xml

JAXB 基礎介紹

  • 簡介:
    • JAXB提供了一種將Java對象編組(寫入)為XML以及將XML解組(讀取)為對象的快速方便的方法。
    • 它支持使用Java註解將XML元素和屬性映射到Java字段和屬性的綁定框架。
    • Java 9中,JAXB已移至單獨的模塊java.xml中。
    • Java 9Java 10中,我們需要使用--add-modules=java.xml.bind選項。
    • Java 11中,JAXB已從JDK中刪除,需要通過MavenGradle將其作為單獨的庫添加到項目中。

  • 定義:
    • 編組是將Java對象轉換為XML的過程。
    • 解組是將XML讀入Java對象的過程。
    • JAXBContext類提供客戶端到JAXB API的入口點。它提供用於編組,解組和驗證的API

  • JAXB註解:
    • JAXB使用Java註解來使用附加信息擴充生成的類。
    • 將此類註解添加到現有Java類可以為JAXB運行時做好準備。
      • @XmlAccessorType:定義對象和XML相互轉換時對象屬性訪問方式,它的可選值是由XmlAccessType類型的枚舉指定。一共支持四種類型。
        1
        @XmlAccessorType(XmlAccessType.FIELD)
      • @XmlRootElement:根XML元素的名稱是從類名派生的,我們也可以使用其name屬性指定XML根元素的名稱。
        1
        @XmlRootElement(name = "BossCycleList")
      • @XmlElement:定義將使用的實際XML元素名稱。
        1
        @XmlElement(name = "BossCycle")
      • @XmlAttribute:定義id映射為屬性而不是元素。
        1
        @XmlAttribute(name = "Name")

        有關JAXB註解的更多詳細信息,請查看此鏈接

JAXB 範例(解組)

此處使用核心內的BossCycle.xml來當作範例。

  • 先觀看XML的結構。
    • BossCycle.xml
  • 所以根據XML的元素與屬性,分別定義出四個Object -
    • L1BossCycleList
    • L1BossCycle
    • Base
    • Cycle
  • 接著使用JAXB來將XML解組至Java對象內,並將內容輸出。
    • Main
    • Console
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      Boss name: DK
      Boss base date: 2008/5/18
      Boss base time: 0:00
      Boss cycle period: 7h
      Boss cycle start: 3h30m
      Boss cycle end: null
      =====================
      Boss name: Oren
      Boss base date: 2002/7/23
      Boss base time: null
      Boss cycle period: 5h
      Boss cycle start: 2h30m
      Boss cycle end: null
      =====================
      Boss name: Aden
      Boss base date: null
      Boss base time: 1:30
      Boss cycle period: 4h
      Boss cycle start: 1h30m
      Boss cycle end: null
      =====================
      Boss name: Caspa
      Boss cycle period: 1h
      Boss cycle start: 30m
      Boss cycle end: null
      =====================
      Boss name: 1Drake
      Boss cycle period: 2h
      Boss cycle start: null
      Boss cycle end: 1h
      =====================
      Boss name: 2Drake
      Boss cycle period: 3h
      Boss cycle start: 1h30m
      Boss cycle end: null
      =====================
      Boss name: Night
      Boss cycle period: 4h
      Boss cycle start: null
      Boss cycle end: 2h
      =====================
      Boss name: Dragon
      Boss cycle period: 1d
      Boss cycle start: null
      Boss cycle end: null
      =====================
      Boss name: etc1
      Boss cycle period: 10m
      Boss cycle start: null
      Boss cycle end: null
      =====================
      Boss name: Unknown
      Boss base date: 2008/5/18
      Boss base time: 0:00
      Boss cycle period: 7h
      Boss cycle start: 3h30m
      Boss cycle end: null
      =====================

JAXB 範例(編組)

此處依舊使用核心內的BossCycle.xml來結構來當作範例,並沿用先前建立的Object

  • 接著使用JAXB來將Java對象編組至XML內,並輸出到檔案BossCycle_test.xml
  • 這邊僅僅做兩組的BossCycle
    • Main
    • 比對原本的XML與新輸出後XML

結論

JAXB

  • 「解組」
    • XML讀入Java對象的過程。

      天堂核心內只有做「解組」的操作。

  • 「編組」
    • 解組是將XML讀入Java對象的過程。

結語

解組後的用途?當取得XML內設定的參數後,可以使用取得的參數進行遊戲內的一些設定;
舉例 -

  • Boss重生的時間、規律。
  • GM的指令詳細配置。
  • 傳送師的各個城鎮的傳送費用。
  • 物品、袋子、箱子開啟後的物品清單。
  • 道具製作的材料清單。
  • 等級任務的設定和條件。

以上等等之類的。

至於為什麼用XML?好處是什麼?可以參考XML 基礎教學

原創文章真的不易,希望多多支持,感謝。
最後建議回顧一下首章天堂私服 | 天堂私服架設教學,了解其章節目錄。

免責聲明

  • 本部落格文章中皆不提供任何所謂的遊戲「主程式」、「模擬器」、「登入器」…等等相關程式的下載點。
  • 本部落格文章中所見之遊戲主程式和服務器端程序均來自網路發佈,版本歸原作者所有
  • 本部落格文章為研究SQL資料庫與修改JAVA語法使用,非商業用途,亦無做營運事實等任何一切商業行為
  • 本部落格文章內容是為研究學習設計思想和原理為目的,絕沒有故意侵權或惡意抄襲、篡改其他遊戲內容

註:以上參考了
Java(TM) EE 7 Specification APIs - Package javax.xml.bind.annotation