2009-12-31 6 views
1

s'il vous plaît aidez-nous. J'ai ce code, c'est ma classe de sérialiser \ désérialiser les paramètres de l'application.Stockez les paramètres d'application personnalisés en 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(); 
     } 
    } 

} 

sérialisation moi simple structure xml donner:

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

Comment dois-je modifier ma classe pour obtenir cette structure xml:

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

@Alex: Veuillez cliquer sur la coche à côté de l'une des réponses pour l'accepter. –

+0

John, je n'ai pas de telles unités de réputation pour voter. Je suis nouveau ici, désolé. – Victor

+1

Vous ne devez pas utiliser '[Serializable]' pour les classes qui seront exécutées via le Serializer Xml. Cet attribut n'est pas nécessaire et son utilisation peut prêter à confusion. – Cheeso

Répondre

8

Par défaut, le XmlSerializer sérialise tous les publics propriétés en tant qu'éléments; pour remplacer ce que vous aurez besoin de marquer chaque propriété avec [XmlAttribute] (de l'espace de noms System.Xml.Serialization) qui vous donnera votre sortie désirée.

Par exemple:

[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; } 

produira quelque chose comme:

<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

J'ai quelques suggestions. Essayez code plus comme ceci:

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

Vous devez mettre le StreamReader et StreamWriter dans using les blocs afin qu'ils seront éliminés, même si une exception se produit. Aussi, je vous suggère de toujours afficher e.ToString() au lieu de seulement e.Message, car il affichera l'exception entière, y compris les exceptions internes.

Aussi, File.Exists fonctionne exactement comme FileInfo.Exists, mais ne nécessite pas de créer une instance avant de l'utiliser. Une dernière remarque est que vous devriez vous pencher sur l'utilisation de la fonction Paramètres au lieu de créer vos propres classes de configuration. Cela vous permet de créer facilement des paramètres de type sécurité qui peuvent être utilisés dans toute votre application, et qui peuvent être par utilisateur ou par application.

+0

+1 pour toutes les suggestions solides – STW

+1

John Merci pour vos suggestions! – Victor