2011-05-09 2 views
1

J'ai une application de console de test, où j'essaie de faire fonctionner la sérialisation et la désérialisation pour stocker des données dans un fichier xml. La méthode serialize fonctionne correctement, mais la désérialisation ne semble pas fonctionner. Il ne produit aucune erreur mais il ne charge pas mes données à partir du fichier .xml. Quelqu'un sait pourquoi?C# La désérialisation ne fonctionne pas?

class Program 
{ 
    static void Main(string[] args) 
    { 
     ArrayList siteList = new ArrayList(); 
     DeserializeArray(); 
     siteList.Add("Test 1"); 
     siteList.Add("Test 2"); 
     foreach (var item in siteList) 
     { 
      Console.WriteLine(item); 
     } 
     SerializeArray(siteList); 
     if (siteList.Contains("Test 2")) 
     { 
      Console.WriteLine("Test 2 exists!"); 
      Console.Read(); 
     } 
    } 

    public static void SerializeArray(ArrayList siteList) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(ArrayList)); 
     TextWriter textWriter = new StreamWriter("SiteList.xml"); 
     serializer.Serialize(textWriter, siteList); 
     textWriter.Close(); 
    } 

    static ArrayList DeserializeArray() 
    { 
     XmlSerializer deserializer = new XmlSerializer(typeof(ArrayList)); 
     TextReader textReader = new StreamReader("SiteList.xml"); 
     ArrayList siteList; 
     siteList = (ArrayList)deserializer.Deserialize(textReader); 
     textReader.Close(); 

     return siteList; 
    } 
} 

}

Répondre

1

Il fonctionne très bien (testé), votre logique Main() est désactivée - vous devez sérialiser avant de désérialisation, essayez ceci:

static void Main(string[] args) 
{ 

    ArrayList siteList = new ArrayList(); 

    siteList.Add("Test 1"); 
    siteList.Add("Test 2"); 
    foreach (var item in siteList) 
    { 
     Console.WriteLine(item); 
    } 
    SerializeArray(siteList); 
    siteList = DeserializeArray(); 
    if (siteList.Contains("Test 2")) 
    { 
     Console.WriteLine("Test 2 exists!"); 
     Console.Read(); 
    } 
} 
+0

cela ne supprime-t-il pas tout le point de la désérialisation? Je pensais que la désérialisation saisissait des données provenant d'une source. Je veux ajouter au fichier .xml existant au lieu d'en créer un nouveau à chaque fois, donc je ne devrais pas le désérialiser en premier? – karlstackoverflow

+0

Si vous voulez ajouter à un XML existant oui, vous pouvez d'abord désérialiser - mais vous devez assigner le résultat à la variable - ce que vous n'avez pas fait: 'ArrayList siteList = DeserializeArray();' – BrokenGlass

+0

http: // stackoverflow .com/questions/5931484/c-deserializing-but-not-added-to-previous-xml – karlstackoverflow

1

Votre code fonctionne bien ici. Je suppose que vous avez votre SiteList.xml de l'exécution précédente, car vous désérialisez d'abord. J'ai ajouté Console.WriteLine pour vider les données désérialisées pour plus de clarté.

class Program 
{ 
    static void Main(string[] args) 
    { 
     ArrayList siteList = new ArrayList(); 
     ArrayList deserealizedArray = DeserializeArray(); 
     foreach (var item in deserealizedArray) 
     { 
      Console.WriteLine(item); 
     } 
     Console.WriteLine("---"); 
     siteList.Add("Test 1"); 
     siteList.Add("Test 2"); 
     foreach (var item in siteList) 
     { 
      Console.WriteLine(item); 
     } 
     SerializeArray(siteList); 
     if (siteList.Contains("Test 2")) 
     { 
      Console.WriteLine("Test 2 exists!"); 
      Console.Read(); 
     } 
    } 

    public static void SerializeArray(ArrayList siteList) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(ArrayList)); 
     TextWriter textWriter = new StreamWriter("SiteList.xml"); 
     serializer.Serialize(textWriter, siteList); 
     textWriter.Close(); 
    } 

    static ArrayList DeserializeArray() 
    { 
     XmlSerializer deserializer = new XmlSerializer(typeof(ArrayList)); 
     TextReader textReader = new StreamReader("SiteList.xml"); 
     ArrayList siteList; 
     siteList = (ArrayList)deserializer.Deserialize(textReader); 
     textReader.Close(); 

     return siteList; 
    } 
} 
+0

Ce code ne fonctionne que lorsqu'un fichier SiteList.xml existe déjà. Pouvez-vous s'il vous plaît le modifier afin qu'il fonctionne quand il doesnt? – karlstackoverflow

+0

Nevermind, implémenté un try-catch – karlstackoverflow

+0

Il semble désérialiser maintenant, cependant, quand de nouvelles données sont sérialisées, elles ne sont pas ajoutées dans la nouvelle liste. Il écrase la liste existante avec les nouvelles données? Des idées? – karlstackoverflow