Sérialisation et désérialisation dans un fichier XML, C #

J’ai le code suivant:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ConsoleApplication28 { class Program { static void Main() { List dirs = FileHelper.GetFilesRecursive(@"c:\Documents and Settings\bob.smith\Desktop\Test"); foreach (ssortingng p in dirs) { Console.WriteLine(p); } //Write Count Console.WriteLine("Count: {0}", dirs.Count); Console.Read(); } static class FileHelper { public static List GetFilesRecursive(ssortingng b) { // 1. // Store results in the file results list. List result = new List(); // 2. // Store a stack of our directories. Stack stack = new Stack(); // 3. // Add initial directory. stack.Push(b); // 4. // Continue while there are directories to process while (stack.Count > 0) { // A. // Get top directory ssortingng dir = stack.Pop(); try { // B // Add all files at this directory to the result List. result.AddRange(Directory.GetFiles(dir, "*.*")); // C // Add all directories at this directory. foreach (ssortingng dn in Directory.GetDirectories(dir)) { stack.Push(dn); } } catch { // D // Could not open the directory } } return result; } } } } 

Le code ci-dessus fonctionne bien pour rechercher récursivement quels fichiers / répertoires se trouvent dans un dossier de mon c :.
J’essaie de sérialiser les résultats de ce que ce code fait dans un fichier XML mais je ne sais pas comment faire.

Mon projet est le suivant: trouver tous les fichiers / répertoires dans un lecteur, sérialiser dans un fichier XML. Ensuite, la deuxième fois que je lance cette application, j’aurai deux fichiers XML à comparer. Je souhaite ensuite désérialiser le fichier XML à partir de la première utilisation de cette application, comparer les différences avec le fichier XML actuel et générer un rapport sur les modifications (c’est-à-dire les fichiers ajoutés, supprimés, mis à jour).

J’espérais obtenir de l’aide car je suis débutant en C # et je suis très très fragile en ce qui concerne la sérialisation et la désérialisation. J’ai beaucoup de mal à coder. Est-ce que quelqu’un peut m’aider?

Merci

Votre résultat est List et ce n’est pas directement sérialisable. Vous devrez envelopper, une approche minimale:

 [Serializable] class Filelist: List { } 

Et puis la (De) Sérialisation va comme suit:

 Filelist data = new Filelist(); // replaces List // fill it using (var stream = File.Create(@".\data.xml")) { var formatter = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter(); formatter.Serialize(stream, data); } data = null; // lose it using (var stream = File.OpenRead(@".\data.xml")) { var formatter = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter(); data = (Filelist) formatter.Deserialize(stream); } 

Mais notez que vous ne comparerez en aucun cas le XML (ce n’est pas pratique). Vous comparerez des instances de liste (désérialisées). Et le XML est au format SOAP, regardez-le. Cela peut ne pas être très utile dans un autre contexte.

Et par conséquent, vous pouvez facilement utiliser un formateur différent (le binary est un peu plus efficace et flexible).

Ou peut-être souhaitez-vous simplement conserver la liste des fichiers au format XML. C’est une question différente.

Pour tous ceux qui ont des problèmes avec la sérialisation XML et la désérialisation. J’ai créé un exemple de classe pour le faire ci-dessous. Cela fonctionne aussi pour les collections récursives (comme les fichiers et les répertoires).

 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sample { [Serializable()] [System.Xml.Serialization.XmlRootAtsortingbute(Namespace = "", IsNullable = false, ElementName = "rootnode")] public partial class RootNode { [System.Xml.Serialization.XmlElementAtsortingbute("collection1")] public List OuterCollections { get; set; } } [Serializable()] public partial class OuterCollection { [XmlAtsortingbute("atsortingbute1")] public ssortingng atsortingbute1 { get; set; } [XmlArray(ElementName = "innercollection1")] [XmlArrayItem("text", Type = typeof(InnerCollection1))] public List innerCollection1Stuff { get; set; } [XmlArray("innercollection2")] [XmlArrayItem("text", typeof(InnerCollection2))] public List innerConnection2Stuff { get; set; } } [Serializable()] public partial class InnerCollection2 { [XmlText()] public ssortingng text { get; set; } } public partial class InnerCollection1 { [XmlText()] public int number { get; set; } } } 

Cette classe se sérialise et se désérialise …. espérons que cela aide.

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Xml.Serialization; using System.Xml; namespace TestStuff { public class Configuration { #region properties public List UIComponents { get; set; } public List Settings { get; set; } #endregion //serialize itself public ssortingng Serialize() { MemoryStream memoryStream = new MemoryStream(); XmlSerializer xs = new XmlSerializer(typeof(Configuration)); using (StreamWriter xmlTextWriter = new StreamWriter(memoryStream)) { xs.Serialize(xmlTextWriter, this); xmlTextWriter.Flush(); //xmlTextWriter.Close(); memoryStream = (MemoryStream)xmlTextWriter.BaseStream; memoryStream.Seek(0, SeekOrigin.Begin); StreamReader reader = new StreamReader(memoryStream); return reader.ReadToEnd(); } } //deserialize into itself public void Deserialize(ssortingng xmlSsortingng) { Ssortingng XmlizedSsortingng = null; using (MemoryStream memoryStream = new MemoryStream()) { using (StreamWriter w = new StreamWriter(memoryStream)) { w.Write(xmlSsortingng); w.Flush(); XmlSerializer xs = new XmlSerializer(typeof(Configuration)); memoryStream.Seek(0, SeekOrigin.Begin); XmlReader reader = XmlReader.Create(memoryStream); Configuration currentConfig = (Configuration)xs.Deserialize(reader); this.Settings = currentConfig.Settings; this.UIComponents = currentConfig.UIComponents; w.Close(); } } } static void Main(ssortingng[] args) { Configuration thisConfig = new Configuration(); thisConfig.Settings = new List(){ "config1", "config2" }; thisConfig.UIComponents = new List(){ "comp1", "comp2" }; //serializing the object ssortingng serializedSsortingng = thisConfig.Serialize(); Configuration myConfig = new Configuration(); //deserialize into myConfig object myConfig.Deserialize(serializedSsortingng); } } } 

John:

Puis-je suggérer une amélioration? Au lieu d’utiliser des noms de fichiers, utilisez l’ object FileInfo . Cela vous permettra d’obtenir des informations beaucoup plus précises sur chaque fichier plutôt que de simplement s’il existe sous le même nom.

La classe XmlSerializer devrait également vous convenir. Il ne sérialisera pas les listes génériques, vous devrez donc sortir votre liste <> vers un tableau ou un autre, mais autre que celui-ci:

  XmlSerializer serial = new XmlSerializer(typeof(FileInfo[])); SsortingngWriter writer = new SsortingngWriter(); FileInfo[] fileInfoArray = GetFileInfos(); serial.Serialize(writer, fileInfoArrays); 

Simple et facile, sauf si l’importance du code XML sérialisé vous importe.

Quoi que vous fassiez, perdez le bloc vide. Vous regretterez d’avoir avalé des exceptions. Connectez-vous ou relancez-les.

Aide n ° 1. Indiquez le code par quatre espaces pour qu’il soit considéré comme un code lorsque vous postez ici.

2: se débarrasser de ce bloc try / catch, car il dévorera toutes les exceptions, y compris celles que vous souhaitez connaître.

3: Avez-vous essayé de tout sérialiser vos résultats? Veuillez modifier votre question pour montrer ce que vous avez essayé. Astuce: utilisez la classe XmlSerializer.

pour la sérialisation xml, vous avez plusieurs possibilités:

  • Le faire manuellement
  • Utilisation de XmlSerializer comme indiqué ci-dessus
  • Utilisation de System.Xml.Serialization
  • Utiliser Linq to Xml

pour les deux derniers, voir un exemple de code dans cette réponse. (Voir quelques pièges ici )

Et pour votre visiteur d’annuaire récursif, vous pouvez envisager de le rendre vraiment récursif: voici quelques exemples de code intéressants.

Cette question est exactement comme celle-ci. J’ai aussi une réponse postée qui fonctionnera pour vous aussi:

Comment sérialiser?