存储XML中的自定义应用程序设置

时间:2009-12-31 19:53:33

标签: c# .net xml-serialization settings

请帮忙。我有这个代码,这是我的类序列化\反序列化应用程序设置。

[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" ....>

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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());
            }
        }
    }

您应该将StreamReaderStreamWriter放在using块中,以便即使发生异常也会将其处理掉。另外,我建议你总是显示e.ToString()而不仅仅是e.Message,因为它会显示整个异常,包括任何内部异常。

此外,File.Exists的工作方式与FileInfo.Exists类似,但在使用之前不需要您创建实例。

最后要注意的是,您应该考虑使用“设置”功能,而不是创建自己的配置类。这使您可以轻松创建可在整个应用程序中使用的类型安全设置,并且可以是每个用户或每个应用程序。