2010-11-09 4 views
1

J'ai mis en place une sérialisation/désérialisation xml pour enregistrer des données dans mon application. Je peux désérialiser des éléments non-array, mais quand je désérialise un tableau, il est vide. J'ai l'impression que le problème est dans la partie set de la propriété im essayant de sérialiser/désérialiser.C#: Comment accéder aux données d'un fichier xml désérialisé?

D'abord la classe que je suis en train de sérialisation:

namespace kineticMold 
{ 
    [Serializable()] 
    public class Config 
    { 
     public Config() { } 
     public string ComPort 
     { 
      get 
      { 
       return comPort; 
      } 
      set 
      { 
       comPort = value; 
      } 
     } 

     [XmlArrayItem("recentFile")] 
     public string[] LastOpen 
     { 

      get 
      { 
       return lastOpen; 
      } 
      set 
      { 

        ArrayList holderList = new ArrayList(); 

        holderList.Add(value); 

        for (int i = 0; i < 4; i++) 
        { 

         holderList.Add(lastOpen[i]); 

        } 

        lastOpen = (string[])lastOpen.ToArray<string>(); 



      } 
     } 

     private string comPort; 
     private string[] lastOpen = new string[5]; 


    } 
} 

Le résultat de la sérialisation:

<?xml version="1.0" encoding="utf-8" ?> 
<Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ComPort>COM12</ComPort> 
    <LastOpen> 
     <recentFile>test.xml</recentFile> 
     <recentFile xsi:nil="true" /> 
     <recentFile xsi:nil="true" /> 
     <recentFile xsi:nil="true" /> 
     <recentFile xsi:nil="true" /> 
    </LastOpen> 
</Config> 

Le code désérialisation:

_cf = new Config(); 
      XmlSerializer ser = new XmlSerializer(typeof(Config)); 

      if (File.Exists(settings_filepath)) 
      { 
       FileStream fs = new FileStream(@settings_filepath, FileMode.Open); 
       _cf = (Config)ser.Deserialize(fs); 
       fs.Close(); 
      } 

Le code pour la lecture des données désérialisé:

for (int i = 0; i < _cf.LastOpen.Length; i++) 
      { 

       if (_cf.LastOpen[i] != null) 
       { 
        toolStripMenuItem1.DropDownItems.Add(_cf.LastOpen[i]); 

        recentState = true; 
       } 
      } 
+0

Avez-vous essayé d'utiliser une liste de * * au lieu? – Stormenet

+0

@Sotmenet - Les listes sont-elles mieux adaptées à la sérialisation? Je n'ai pas encore essayé. J'ai essayé un Arraylist, mais cela a échoué lamentablement. – Bildsoe

+0

Non, cela ne fait pas de différence, mais cela pourrait être plus utile pour vous en tant qu'utilisateur. – leppie

Répondre

1

Vous avez:

lastOpen = (string[])lastOpen.ToArray<string>(); 

Voulez-vous dire holderList ici (sur le côté droit)?

Ce n'est pas entièrement effacer les données que vous voulez, mais vous ne gardez actuellement aucun des éléments de value au-delà du setter. En outre, ArrayList est largement redondant ici; il pourrait être un List<string> peut-être?

Bien sûr, encore plus simple:

private readonly List<string> lastOpen = new List<string>(); 
[XmlArrayItem("recentFile")] 
public List<string> LastOpen {get {return lastOpen;}} 

(et laissez-le appeler souci de code sur la façon dont le nombre d'éléments à garder là-bas)

+0

Bonjour Marc. J'ai changé mon code, en utilisant toujours Array, mais en laissant le code appelant s'inquiéter du nombre d'éléments à conserver, et en changeant le contenu si nécessaire, cela a été fait, merci. – Bildsoe

Questions connexes