XmlSerializer.Deserialize()未正确反序列化List <T>

And*_*ndy 5 .net c# xml-serialization

我是C#XmlSerializer的新手,所以我可能会遗漏一些基本的东西.

我遇到的问题是我有一个类有List<T>另一个类.当我序列化主类时,XML看起来很漂亮,所有数据都完好无损.当我反序列化XML时,数据List<T>消失了,我留空了List<T>.我没有收到任何错误,序列化部分就像魅力一样.

反序列化过程中我错过了什么?

编辑:请注意,下面显示的代码不会重现问题 - 它的工作原理.这是真正的代码,做了一个简单的版本工作.不幸的是,下面的代码已经足够简化,无法重现问题!

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);
}
Run Code Online (Sandbox Code Playgroud)

通过执行CreateAndSave()生成的XML如下所示:

<User>
  <Username>Somebody</Username>
  <Characters>
    <Character>
      <Name>Tranzor Z</Name>
      <Skills>
        <Skill>TreeClimber</Skill>
      </Skills>
    </Character>
  <Characters>
</User>
Run Code Online (Sandbox Code Playgroud)

完善!这就是应该看的样子.如果我然后执行RestoreAndPrint()我得到一个User对象,其Username属性设置正确但Characters属性是一个空列表:

Username: Somebody
Characters: 0
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释为什么Characters属性被正确序列化但不会反序列化?

Mar*_*ell 5

无法重现; 我得到(在修复更直接的错误之后):

Username: Somebody
Characters: 1
Run Code Online (Sandbox Code Playgroud)

变化:

  • WriteLine而不是WriteFormat(阻止它编译)
  • 初始化默认构造函数中的列表(阻止CreateAndSave工作):
    • public User() { Characters = new List<Character>(); }
    • public Character() { Skills = new List<Skill>(); }


And*_*ndy 1

在对代码进行了长时间的摸索之后,我最终放弃了使用 XmlSerializer 的默认行为的想法。

所有相关类现在都继承 IXmlSerializer 并实现 ReadXml() 和 WriteXml() 函数。我真的希望采取懒惰的路线,但现在我已经使用了 IXmlSerializer,我意识到这真的一点也不困难,而且增加的灵活性非常好。