XmlSerializer.Deserialize() n'est pas la désérialisation d'une Liste<T> correctement

Je suis nouveau sur le C# XmlSerializer donc j'ai peut-être raté quelque chose de base ici.

Le problème, je suis en cours d'exécution, c'est que j'ai une classe qui a un List<T> d'une autre classe. Quand je sérialiser la classe principale de l'XML est magnifique et toutes les données sont intactes. Quand je désérialiser le XML, les données dans le List<T> disparait et je suis parti avec un vide List<T>. Je ne reçois pas toutes les erreurs et la sérialisation partie fonctionne comme un charme.

Ce qui me manque avec le processus de désérialisation?

EDIT: Noter que le code ci-dessous ne permet pas de reproduire le problème, il fonctionne. C'était une version simplifiée du code réel, qui n'a pas travail. Malheureusement, le code ci-dessous a été simplifié assez pour ne pas reproduire le problème!

public class User
{
public User()
{
this.Characters = new List<Character>();
}
public string Username { get; set; }
public List<Character> Characters { get; set; }
}
public class Character
{
public Character()
{
this.Skills = new List<Skill>();
}
public string Name { get; set; }
public List<Skill> Skills { get; set; }
}
public enum Skill
{
TreeClimber,
ForkliftOperator
}
public static void Save(User user)
{
using (var textWriter = new StreamWriter("data.xml"))
{
var xmlSerializer = new XmlSerializer(typeof(User));
xmlSerializer.Serialize(textWriter, user);
}
}
public static User Restore()
{
if (!File.Exists("data.xml"))
throw new FileNotFoundException("data.xml");
using (var textReader = new StreamReader("data.xml"))
{
var xmlSerializer = new XmlSerializer(typeof(User));
return (User)xmlSerializer.Deserialize(textReader);
}
}
public void CreateAndSave()
{
var character = new Character();
character.Name = "Tranzor Z";
character.Skills.Add(Skill.TreeClimber);
var user = new User();
user.Username = "Somebody";
user.Characters.Add(character);
Save(user);
}
public void RestoreAndPrint()
{
var user = Restore();
Console.WriteLine("Username: {0}", user.Username);
Console.WriteLine("Characters: {0}", user.Characters.Count);
}

Le XML généré par l'exécution de CreateAndSave() ressemble à ceci:

<User>
<Username>Somebody</Username>
<Characters>
<Character>
<Name>Tranzor Z</Name>
<Skills>
<Skill>TreeClimber</Skill>
</Skills>
</Character>
<Characters>
</User>

Parfait! C'est la façon dont il devrait ressembler. Si je puis exécuter RestoreAndPrint() - je obtenir un objet Utilisateur avec le nom d'utilisateur de propriété définis correctement, mais les Caractères de la propriété est une liste vide:

Username: Somebody
Characters: 0

Quelqu'un peut-il m'expliquer pourquoi les Personnages de propriété est sérialisé correctement mais ne désérialiser?

vous n'avez pas besoin [Serializable] sur les types. Le comportement de la Sérialiseur Xml est complètement indépendant de l'attribut.
OK; donc, puisque nous (ou moi, au moins) pensez que le problème est dans le "vrai" code (non illustré); faites-vous quelque chose d'intéressant dans le "set" de l'accesseur de la liste? Ce serait le premier endroit où je regarde.
Non, ils sont tous des propriétés de base avec rien de compliqué dans le d'obtenir ou de définir des accesseurs. Ils se ressemblent tous un peu comme ça: public T PropertyName { get; set; }
Même pour les listes? c'est à dire public List<T> PropName {get;set;}?
Même pour les listes. La seule raison pour laquelle j'ai publics setters sur les listes, bien que, est pour le deserializer. Si les opérateurs privés puis le XmlSerializer déclenche une exception InvalidOperationException de se plaindre au sujet de la lecture-seulement les Caractères de la propriété.

OriginalL'auteur Andy | 2009-05-20