DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 利用XML序列化實現程序配置文件
利用XML序列化實現程序配置文件
編輯:XML詳解     

 有些應用程序在退出的時候,會將一些設置值寫入到文件裡,以便下次程序啟動時調用,這個文件統稱為配置文件。例如:Windows的掃雷程序,在每次啟動的時候,都會出現在上次關閉的位置,就是因為掃雷程序在退出的時候將當前位置寫入到配置文件裡。

  早期的配置文件的實現有兩種方法。一是INI文件,在Win32的API中還專門有讀寫INI文件的API函數;另一個是注冊表,這也是很多程序的首選,在版本較新的掃雷程序就是利用注冊表實現配置函數。不過,上述的兩種方法都有其的局限性。INI文件,結構簡單,容易編輯,有容量的上限(64K)。注冊表雖然沒有容量的限制,不過讀寫注冊表還是一件很麻煩的事,而且還容易在注冊表中產生冗余(刪除程序的時候還得操作注冊表),也有和其他程序想沖的可能。最主要的問題就是,無論是INI文件還是注冊表都只能實現簡單的配置讀寫,很難實現類似對象的讀寫,因為他們的條目之間是平行的,而不是類似樹狀的節點結構(注冊表雖能實現樹狀結構,但是讀寫還是比較麻煩,也不太安全)。

  而利用XML文件就能很好的彌補上面的不足。首先是文件型的,不會讀寫注冊表,不會有安全的後顧之憂;其次沒有文件容量大小的限制,而且XML 文件天生是樹狀結構,很適合實現對象的讀寫。目前XML文件的應用越來越廣泛,已經成為主流,你隨便打開一個程序所在的目錄,很少不看到XML文件的,而且主流的開發軟件都有讀寫XML的庫文件。操作XML文件現在是很便利的一件事。

  XML文件序列化是XML技術的一個分支,他可以把程序中的一個對象(例如自己編寫的類的一個實例)序列化成XML文件。他也可以把XML文件反序列化為程序中的一個對象。


有關XML序列化比較好的文章,我個人感覺下面這篇比較好。

  NET對象的XML序列化和反序列化

  這就給了我們的一個思路,我們可以把要讀寫的配置封裝在自己編寫的配置類中,然後通過XML序列化,來實現配置類和XML文件的轉化。

  例如:下面這個例子就是利用XML序列化在類對象和XML之間轉換,用的是C#

  下面例子中的xml schema 描述了一個簡單的人力資源信息,其中包含了xml的大部分格式,如xml 元素相互嵌套, XML元素既有元素值,又有屬性值。

  1. 待序列化的類層次結構

  [XMLRoot("humanResource")]public class HumanResource
    {
      private int m_record = 0;
      private Worker[] m_workers = null;
      [XMLAttribute(AttributeName="record")]public int Record
        {
          get { return m_record; }
          set { m_record = value; 
        }
 
      [XMLElement(ElementName="worker")]public Worker[] Workers
        {
          get { return m_workers; }
          set { m_workers = value; }
        }
    }
 
  public class Worker
    {
      private string m_number = null;
      private InformationItem[] m_infoItems = null;
      [XMLAttribute("number")]public string Number
        {
          get { return m_number; }
          set { m_number = value; }
        }
 
      [XMLElement("infoItem")]public InformationItem[] InfoItems
        {
          get { return m_infoItems; }
          set { m_infoItems = value; }
        }
    }
 
  public class InformationItem
    {
      private string m_name = null;
      private string m_value = null;
      [XMLAttribute(AttributeName = "name")]public string Name
        {
          get { return m_name; }
          set { m_name = value; }
        }
       [XMLText]public string Value
        {
          get { return m_value; }
          set { m_value = value; }
        }
    }


 

2. 序列化生成的XML結構

  <?XML version="1.0" ?>
  <humanResource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" record="2">
    <worker number="001">
      <infoItem name="name">Michale</infoItem>
      <infoItem name="sex">male</infoItem>
      <infoItem name="age">25</infoItem>
    </worker>
    <worker number="002">
      <infoItem name="name">Surce</infoItem>
      <infoItem name="sex">male</infoItem>
      <infoItem name="age">28</infoItem>
    </worker>
  </humanResource>

  由於幾乎每個程序都會有讀寫配置文件的操作。那麼把XML的序列化和反序列化的操作封裝在一個獨立的類中,以供用的時候調用。下面是這個類的代碼,用的是VB2005

  Imports System
  Imports System.XML
  Imports System.XML.Serialization
  Imports System.Text

  '引用合適的命名空間

  Public Interface I_Settings
    Sub InitSettings()
    Function [GetType]() As Type
  End Interface

  '定義一個接口,將XML文件轉化為實現這個接口的對象。

  Public Class clsXMLSettings
    Public Sub LoadSettings(ByVal Filename As String, ByRef Settings As I_Settings)
      'Settings由於是實現接口的對象,則限定詞一定得是ByRef,否則反序列化後,又恢復為初始值
      If My.Computer.FileSystem.FileExists(Filename) = False Then Exit Sub
      If Settings Is Nothing Then Exit Sub
      Settings.InitSettings()
      Dim tB() As Byte = My.Computer.FileSystem.ReadAllBytes(Filename)
      Dim tS As IO.Stream = New IO.MemoryStream(tB)
      Dim XS As New XMLSerializer(Settings.GetType)
      Settings = XS.Deserialize(tS)
    End Sub
    Public Sub SaveSettings(ByVal FileName As String, ByRef Settings As I_Settings)
      If Settings Is Nothing Then Exit Sub
      Dim tS As New IO.MemoryStream
      Dim XS As New XMLSerializer(Settings.GetType)
      XS.Serialize(tS, Settings)
      Dim tB() As Byte = tS.ToArray
      My.Computer.FileSystem.WriteAllBytes(FileName, tB, False)
    End Sub
  End Class

  實現I_Settings接口的對象,必須實現兩個方法。InitSettings為初始化類中的屬性值。如果XML中沒有對應的設置時,類相應的值就用原來的初始值。GetType方法返回對象的Type屬性,只要在方法中加一句話就行了:

  Return Me.GetType

  但也意味著,在反序列化的時候必須先實例化對象。

  通過以上的類,封裝了XML序列化和反序列化。任何實現I_Settings的類,都能和相應的XML文件互相轉化。也就實現了本文的利用XML序列化實現程序配置文件的思路。

 

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved