Soy nuevo en el C# XmlSerializer, así que podría estar perdiendo algo básico aquí.XmlSerializer.Deserialize() no está deserializando una Lista <T> correctamente
El problema que me estoy encontrando es que tengo una clase que tiene un List<T>
de otra clase. Cuando serializo la clase principal, el XML se ve hermoso y todos los datos están intactos. Cuando deserializo el XML, los datos en el List<T>
desaparecen y me queda un List<T>
vacío. No recibo ningún error y la parte de serialización funciona como encanto.
¿Qué me está perdiendo con el proceso de deserialización?
EDITAR: Tenga en cuenta que el código que se muestra a continuación no reproduce el problema, funciona. Esta fue una versión simplificada del código real, que hizo no trabajo. Lamentablemente, el código siguiente se simplificó lo suficiente como para no reproducir el problema.
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);
}
El XML generado mediante la ejecución de CreateAndSave() se ve así:
<User>
<Username>Somebody</Username>
<Characters>
<Character>
<Name>Tranzor Z</Name>
<Skills>
<Skill>TreeClimber</Skill>
</Skills>
</Character>
<Characters>
</User>
perfecto! Esa es la forma en que debería verse. Pues si yo ejecuto RestoreAndPrint()
consigo un objeto de usuario con la propiedad nombre de usuario configurado correctamente pero la propiedad personajes es una lista vacía:
Username: Somebody
Characters: 0
Puede alguien explicarme por qué la propiedad Characters se serializa correctamente, pero no va a deserializar?
no necesita [Serializable] en los tipos. El comportamiento del Xml Serializer es completamente independiente de ese atributo. – Cheeso
OK; así que nosotros (o yo, al menos) sospechamos que el problema está en el código "real" (no se muestra); ¿Hace algo interesante en el acceso "establecido" de las listas? Ese sería el primer lugar donde miraría. –
No, todas son propiedades básicas sin nada de lujos en los accesadores get o set. Todos se ven así: public T PropertyName {get; conjunto; } – Andy