我是新來的C#XmlSerializer,所以我可能會缺少一些基本的東西在這裏。XmlSerializer.Deserialize()不正確反序列化<T>
我遇到的問題是我有一個類有另一個類的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);
}
通過執行CreateAndSave(生成的XML)看起來像這樣:
<User>
<Username>Somebody</Username>
<Characters>
<Character>
<Name>Tranzor Z</Name>
<Skills>
<Skill>TreeClimber</Skill>
</Skills>
</Character>
<Characters>
</User>
完美!這是它應該看起來的樣子。如果我再執行RestoreAndPrint()
我得到的用戶名屬性的用戶對象設置正常,但字符屬性是一個空列表:爲什麼字符屬性正確序列化到我
Username: Somebody
Characters: 0
任何人能解釋,但不會反序列化?
你不需要[Serializable]類型。 Xml Serializer的行爲完全獨立於該屬性。 – Cheeso 2009-05-20 21:44:15
好的;因爲我們(或者我至少)懷疑問題出在「真實」的代碼中(未顯示)。你在列表的「設置」訪問器中做了什麼有趣的事情?那將是我看起來的第一個地方。 – 2009-05-20 21:59:41
不,它們都是基本屬性,在get或set訪問器中沒有什麼特別之處。他們都看起來有點像這樣: public T PropertyName {get;組; } – Andy 2009-05-20 22:06:54