天堂私服 | JAXB 基礎
章節用意
核心中有使用JAXB
對XML
進行解組並使用,在進行更進一步的分析時,需要先了解JAXB
的基礎使用。
此章節將會介紹如何使用JAXB
對XML
進行解組(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 9
和Java 10
中,我們需要使用--add-modules=java.xml.bind
選項。 - 在
Java 11
中,JAXB
已從JDK
中刪除,需要通過Maven
或Gradle
將其作為單獨的庫添加到項目中。
- 定義:
- 編組是將
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
58Boss 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