以XML格式存储自定义应用程序设置
问题描述:
请大家帮忙。我有这个代码,这是我的课程序列化\反序列化应用程序设置。以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());
}
}
}
你应该把StreamReader
和StreamWriter
在using
块,使他们即使发生异常处置。另外,我建议你总是显示e.ToString()而不是e.Message,因为它会显示整个异常,包括任何内部异常。
此外,File.Exists的工作原理与FileInfo.Exists类似,但不需要您在使用它之前创建实例。
最后一点需要注意的是,您应该考虑使用设置功能而不是创建自己的配置类。这使您可以轻松创建可在整个应用程序中使用的类型安全设置,其中可以是每个用户或每个应用程序。
@Alex:请点击其中一个答案旁边的复选标记以接受它。 – 2010-01-01 02:53:22
约翰,我没有这样的信誉单位投票。我是新来的,对不起。 – Victor 2010-01-01 10:23:04
对于将通过Xml串行器运行的类,不应该使用'[Serializable]'。不需要这个属性,它的使用可能会令人困惑。 – Cheeso 2010-12-26 19:44:36