存储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结构:

 navuhodonoser matrix Mr.Smith neo 

如何修改我的类来获得这个xml结构?:

  

默认情况下,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; } 

会产生类似的东西:

  Value  Value  

我有几点建议。 尝试更像这样的代码:

  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块中,以便即使发生exception也会将它们处理掉。 另外,我建议你总是显示e.ToString()而不仅仅是e.Message,因为它会显示整个exception,包括任何内部exception。

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

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