2009-12-31 50 views
1

請大家幫忙。我有這個代碼,這是我的課程序列化\反序列化應用程序設置。以XML格式存儲自定義應用程序設置

[XmlRoot("EvaStartupData")] 
[Serializable] 
public class MyConfigClass 
{ 
    public string ServerName { get; set; } 
    public string Database { get; set; } 
    public string UserName { get; set; } 
    public string UserLogin { get; set; } 


    public static void MyConfigLoad() 
    { 
     FileInfo fi = new FileInfo(myConfigFileName); 
     if (fi.Exists) 
     { 
      XmlSerializer mySerializer = new XmlSerializer(myConfigClass.GetType()); 
      StreamReader myXmlReader = new StreamReader(myConfigFileName); 
      try 
      { 

       myConfigClass = (MyConfigClass)mySerializer.Deserialize(myXmlReader); 
       myXmlReader.Close(); 
      } 
      catch (Exception e) 
      { 
       MessageBox.Show("Ошибка сериализации MyConfigLoad\n" + e.Message); 
      } 

      finally 
      { 
       myXmlReader.Dispose(); 
      } 
     } 
    } 

    public static void MyConfigSave() 
    { 
     XmlSerializer mySerializer = new XmlSerializer(myConfigClass.GetType()); 
     StreamWriter myXmlWriter = new StreamWriter(myConfigFileName); 
     try 
     { 
      mySerializer.Serialize(myXmlWriter, myConfigClass); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("Ошибка сериализации MyConfigSave\n" + e.Message); 
     } 

     finally 
     { 
      myXmlWriter.Dispose(); 
     } 
    } 

} 

系列化給予的我簡單的XML結構:

<ServerName>navuhodonoser</ServerName> 
<Database>matrix</Database> 
<UserName>Mr.Smith</UserName> 
<UserLogin>neo</UserLogin> 

我該怎麼修改我的類來得到這個XML結構:

<Connection ServerName="navuhodonoser" Database="matrix" ....> 
+0

@Alex:請點擊其中一個答案旁邊的複選標記以接受它。 – 2010-01-01 02:53:22

+0

約翰,我沒有這樣的信譽單位投票。我是新來的,對不起。 – Victor 2010-01-01 10:23:04

+1

對於將通過Xml串行器運行的類,不應該使用'[Serializable]'。不需要這個屬性,它的使用可能會令人困惑。 – Cheeso 2010-12-26 19:44:36

回答

8

默認情況下,XmlSerializer的會序列所有的公共屬性作爲元素;重寫你需要用[XmlAttribute](來自System.Xml.Serialization命名空間)標記每個屬性,它會給你所需的輸出。

例如:

[XmlAttribute] 
public string ServerName { get; set; } 

[XmlAttribute] 
public string Database { get; set; } 

[XmlElement] 
public string UserName { get; set; } 

// Note: no attribute 
public string UserLogin { get; set; } 

會產生類似:

<xml ServerName="Value" Database="Value"> 
    <UserName>Value</UserName> <!-- Note that UserName was tagged with XmlElement, which matches the default behavior --> 
    <UserLogin>Value</UserLogin> 
</xml> 
3

我有幾個建議。嘗試代碼更是這樣的:

public static void MyConfigLoad() 
    { 
     if (!File.Exists(myConfigFileName)) 
     { 
      return; 
     } 

     XmlSerializer mySerializer = new XmlSerializer(myConfigClass.GetType()); 
     using (StreamReader myXmlReader = new StreamReader(myConfigFileName)) 
     { 
      try 
      { 
       myConfigClass = (MyConfigClass)mySerializer.Deserialize(myXmlReader); 
      } 
      catch (Exception e) 
      { 
       MessageBox.Show("Ошибка сериализации MyConfigLoad\n" + e.ToString()); 
      } 
     } 
    } 

    public static void MyConfigSave() 
    { 
     XmlSerializer mySerializer = new XmlSerializer(myConfigClass.GetType()); 
     using (StreamWriter myXmlWriter = new StreamWriter(myConfigFileName)) 
     { 
      try 
      { 
       mySerializer.Serialize(myXmlWriter, myConfigClass); 
      } 
      catch (Exception e) 
      { 
       MessageBox.Show("Ошибка сериализации MyConfigSave\n" + e.ToString()); 
      } 
     } 
    } 

你應該把StreamReaderStreamWriterusing塊,使他們即使發生異常處置。另外,我建議你總是顯示e.ToString()而不是e.Message,因爲它會顯示整個異常,包括任何內部異常。

此外,File.Exists的工作原理與FileInfo.Exists類似,但不需要您在使用它之前創建實例。

最後一點需要注意的是,您應該考慮使用設置功能而不是創建自己的配置類。這使您可以輕鬆創建可在整個應用程序中使用的類型安全設置,其中可以是每個用戶或每個應用程序。

+0

+1對於所有堅實的建議 – STW 2009-12-31 20:56:21

+1

約翰感謝您的建議! – Victor 2010-01-01 02:33:04

相關問題