Désérialiser la liste object

J’essaie de désérialiser un fichier XML en object, mais je suis bloqué dans une situation. Quelqu’un peut-il m’aider s’il vous plaît ici.

XML:

             

Code:

  [XmlRoot("Level")] public class LData { [XmlArray("Warp_Blocks")] [XmlArrayItem("Warp_Block",typeof(WarpBlock),IsNullable = false)] public List WarpBlocks; } public class LBlock { [XmlAtsortingbute("row")] public int row; [XmlAtsortingbute("col")] public int col; } public class WarpBlock { [XmlArray("Warp_Block")] [XmlArrayItem("Block",typeof(LBlock),IsNullable= false)] public List WarpBlocks; public WarpBlock() { WarpBlocks = new List(); } } 

Je peux désérialiser à un niveau, c’est-à-dire que j’obtiens une liste d’objects Article mais les objects Article individuels ne contiennent pas la liste d’objects Liste. Qu’est-ce que je fais mal ici?

Changez votre classe LData en ceci:

 [XmlRoot("Level")] public class LData { [XmlElement("Warp_Blocks")] public List WarpBlocks; } 

MODIFIER:
Je ne sais pas pourquoi il ne lit pas votre deuxième Warp_Block. Je pense que la seule raison possible peut être que vous faites autre chose que ce que vous avez posté dans la question. Voici l’exemple complet:

 [XmlRoot("Level")] public class LData { [XmlElement("Warp_Blocks")] public List WarpBlocks; } public class LBlock { [XmlAtsortingbute("row")] public int row; [XmlAtsortingbute("col")] public int col; } public class WarpBlock { [XmlArray("Warp_Block")] [XmlArrayItem("Block", typeof(LBlock), IsNullable = false)] public List WarpBlocks; public WarpBlock() { WarpBlocks = new List(); } } public class Program { public static void Main() { ssortingng test = "" + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; byte[] byteArray = Encoding.ASCII.GetBytes(test); MemoryStream stream = new MemoryStream(byteArray); XmlSerializer s = new XmlSerializer(typeof (LData)); LData data = (LData) s.Deserialize(stream); foreach (var a in data.WarpBlocks) foreach (var b in a.WarpBlocks) Console.WriteLine(b.row + ", " + b.col); Console.ReadKey(); } } 

Il affiche correctement ceci:

 7, 7 2, 7 4, 4 3, 7 

Je ne sais pas exactement ce que vous faites ici, mais il existe un problème avec la désérialisation (au moins la désérialisation binary. Je ne sais pas, mais je soupçonne qu’il en va de même pour la sérialisation XML). Lors de la désérialisation d’une List ou d’un Dictionary , la liste est remplie de valeurs null (ou de la valeur par défaut s’il s’agit d’un type de valeur) jusqu’à la sortie du constructeur de désérialisation. Ce n’est qu’après la sortie du constructeur que la liste est remplie avec les T s réels et désérialisés.

Cela signifie que si vous voulez faire quelque chose avec la liste, cela ne peut pas être fait dans le constructeur. Vous pouvez plutôt créer une méthode contenant tout travail à effectuer avec la liste et tant qu’elle est annotée avec l’atsortingbut [OnDeserializedAtsortingbute] , elle sera appelée après le remplissage de la liste mais avant le retour de la désérialisation. La méthode peut avoir n’importe quel nom.

Voir MSDN pour plus de détails.