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属性被正确序列化但不会反序列化?
无法重现; 我得到(在修复更直接的错误之后):
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>(); }在对代码进行了长时间的摸索之后,我最终放弃了使用 XmlSerializer 的默认行为的想法。
所有相关类现在都继承 IXmlSerializer 并实现 ReadXml() 和 WriteXml() 函数。我真的希望采取懒惰的路线,但现在我已经使用了 IXmlSerializer,我意识到这真的一点也不困难,而且增加的灵活性非常好。
| 归档时间: |
|
| 查看次数: |
10938 次 |
| 最近记录: |