標籤: XML序列化

線上遊戲實作技術-設定檔XML序列化

簡介

這篇教學文章主要介紹如何編寫一個設定檔,這個設定檔可以直接用文字編輯器打開與修改,這些設定可以在程式執行時讀取,相比直接把資料寫死在程式碼中,擁有較高的修改自由度與避免重要資訊公開。

設定檔

設定檔就是一些變數值,通常在程式執行期間都不會進行更改,在課程的線上遊戲當中,我會透過設定檔來儲存資料庫的位置與帳號密碼,如此一來,這些資訊就可以另外設定,不會因為放到GitHub上而被其他人看到,當我想要修改這些值的時候,也可以不需要重新建置我的程式。

XML

wikiExtensible Markup Language,簡稱:XML,就是使用一大堆<>標籤來表達資料結構的一種資料格式,C#中內建有XML格式的序列化工具,XML本身也具有可閱讀的特性,適合拿來快速實作設定檔。

序列化

序列化(Serialization),指的是將各種形式的資料轉換成一種可以被傳輸的中間表達形式,通常用來進行網路傳輸工作。當你需要透過網路傳送一個比較複雜的資料結構時,如果你不想將整個資料一一拆解成最簡單的資料型態,那麼你就需要使用這項技術才能把資料傳送過去。例如有一個複雜的類別,裡面儲存了很多不同型態的資料,其中還包刮了多型集合,要將這種複雜資料傳到另一個地方是有難度的,序列化可以將這些複雜的資料轉換成一些低階的資料格式,如string,byte[]之類的,這些就很容易被傳輸。在透過反序列化(Deserialization)將中間資料轉換成原來的資料。

中間資料有很多種格式,binary,json,xml等等,這裡我們會介紹C#中XML格式的序列化方式。

實例

參考https://github.com/NCTUGDC/HearthStone/blob/master/HearthStone/HearthStone.Server/Configurations/DatabaseConfiguration.cs

using System.IO;//使用讀寫檔案的部分
using System.Xml;//使用建立與讀取xml格式資料的部分
using System.Xml.Serialization;//使用xml序列化工具

在屬性或欄位上加上[XmlElement]標註,表示這個資料要被序列化與反序列化
XmlSerializer serializer = new XmlSerializer(typeof(DatabaseConfiguration));
告訴XmlSerializer這是要序列化哪一種類別
用XmlReader來反序列化資料(從檔案把資料讀出來成物件)
用XmlWriter來序列化資料(把資料寫入檔案)

參考上面的程式碼範例,當檔案存在時就讀取,當不存在時就新建一個空的,第一次使用的時候你可以靠這樣自動產生一個空的後再來修改。產生的檔案會長成這樣

<?xml version="1.0" encoding="utf-8"?><DatabaseConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Hostname>not set</Hostname><Username>not set</Username><Password>not set</Password><Database>not set</Database></DatabaseConfiguration>

你需要手動的調整一下縮排

<?xml version="1.0" encoding="utf-8"?>
<DatabaseConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Hostname>not set</Hostname>
    <Username>not set</Username>
    <Password>not set</Password>
    <Database>not set</Database>
</DatabaseConfiguration>

把標籤中的資料換成你想要的就可以很方便的使用了。

在伺服器啟動的時候把這些資料讀取進來使用即可。

DatabaseConfiguration config;
DatabaseConfiguration.Load(“config/test.config", out config)

你可以在你的伺服器程式執行資料夾(有bin和log的)中新加一個config資料夾,這樣比較容易找到設定檔,設定檔約定俗成的用.config當作附檔名,PhotonServer環境也會自動偵測到有.config檔案的改變會重開該伺服器程式。

讀取到資料後你就可以用這些資料來做事了。

如果你不想用MySQL資料庫,你也可以研究看看要怎麼用XML來做儲存資料的文件檔。