Tôi mới vào C# XmlSerializer vì vậy tôi có thể thiếu một cái gì đó cơ bản ở đây.XmlSerializer.Deserialize() không phải là deserializing một Danh sách <T> chính xác
Vấn đề tôi đang gặp phải là tôi có một lớp học có List<T>
của một lớp khác. Khi tôi tuần tự hóa lớp chính, XML trông đẹp và tất cả dữ liệu vẫn còn nguyên vẹn. Khi tôi deserialize XML, dữ liệu trong các List<T>
biến mất và tôi còn lại với một trống rỗng List<T>
. Tôi không nhận được bất kỳ lỗi nào và phần tuần tự hóa hoạt động như sự quyến rũ.
Tôi đang thiếu gì với quá trình deserialization?
EDIT: Lưu ý rằng mã được hiển thị bên dưới không tái tạo sự cố - nó hoạt động. Đây là phiên bản đơn giản của mã thực, đã làm việc không hoạt động. Thật không may, mã dưới đây đã được đơn giản hóa đủ để không tái tạo vấn đề!
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);
}
XML được tạo ra bằng cách thực hiện CreateAndSave() trông giống như vậy:
<User>
<Username>Somebody</Username>
<Characters>
<Character>
<Name>Tranzor Z</Name>
<Skills>
<Skill>TreeClimber</Skill>
</Skills>
</Character>
<Characters>
</User>
Perfect! Đó là cách nó nên nhìn. Nếu tôi sau đó thực hiện RestoreAndPrint()
tôi nhận được một đối tượng người dùng với tài sản Tên thiết lập đúng nhưng nhân vật sở hữu là một danh sách rỗng:
Username: Somebody
Characters: 0
Ai có thể giải thích cho tôi tại sao sở hữu nhân vật được đăng đúng nhưng sẽ không deserialize?
bạn không cần [Serializable] trên các loại. Hành vi của Xml Serializer hoàn toàn độc lập với thuộc tính đó. – Cheeso
OK; vì vậy kể từ khi chúng tôi (hoặc tôi, ít nhất) nghi ngờ vấn đề là trong mã "thực" (không được hiển thị); bạn có làm bất cứ điều gì thú vị trong bộ truy cập "set" của danh sách không? Đó sẽ là nơi đầu tiên tôi nhìn. –
Không, chúng là tất cả các thuộc tính cơ bản không có gì lạ mắt trong các trình truy cập nhận hoặc đặt. Tất cả họ trông giống như vậy: công khai T PropertyName {get; bộ; } – Andy