簡體   English   中英

存儲XML中的自定義應用程序設置

[英]Store custom application settings in 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" ....>

默認情況下,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>

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

    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());
            }
        }
    }

您應該將StreamReaderStreamWriter放入using塊中,以便即使發生異常也會將它們處理掉。 另外,我建議你總是顯示e.ToString()而不僅僅是e.Message,因為它會顯示整個異常,包括任何內部異常。

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

最后要注意的是,您應該考慮使用“設置”功能,而不是創建自己的配置類。 這使您可以輕松創建可在整個應用程序中使用的類型安全設置,並且可以是每個用戶或每個應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM