[英]Deserialize XML nested collections in C#
因此,在反序列化具有嵌套集合的XML时遇到麻烦。 在添加嵌套集合(Grades)之前,我能够反序列化它,但此后一直无法。 任何帮助将是巨大的!
以下是XML被序列化为的内容:
<?xml version="1.0" encoding="utf-8"?>
<ListOfPlayers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Player>
<FirstName>Michael</FirstName>
<LastName>Jordan</LastName>
<EmailAddress>jordanm@seattleu.edu</EmailAddress>
<PhoneNumber>206-227-6000</PhoneNumber>
<NumberOfExtraTeamsWillingToFill>2</NumberOfExtraTeamsWillingToFill>
<IsActive>true</IsActive>
<InactiveReason />
<PlayerNotes />
<GradesCurrentlyEnrolled>
<Grades>First</Grades>
<Grades>Second</Grades>
</GradesCurrentlyEnrolled>
</Player>
<Player>
<FirstName>Magic</FirstName>
<LastName>Johnson</LastName>
<EmailAddress>johnsonm@seattleu.edu</EmailAddress>
<PhoneNumber>206-227-6000</PhoneNumber>
<NumberOfExtraTeamsWillingToFill>3</NumberOfExtraTeamsWillingToFill>
<IsActive>true</IsActive>
<InactiveReason />
<PlayerNotes>Has a new baby</PlayerNotes>
<GradesCurrentlyEnrolled>
<Grades>Sixth</Grades>
<Grades>Eighth</Grades>
</GradesCurrentlyEnrolled>
</Player>
</ListOfPlayers>
这是播放器类的代码:
public class Player : ModelBase
{
public Player()
{
FirstName = "";
LastName = "";
PhoneNumber = "";
EmailAddress = "";
NumberOfExtraTeamsWillingToFill = 0;
IsActive = true;
InactiveReason = "";
PlayerNotes = "";
GradesCurrentlyEnrolled = new ListOfGrades();
}
public Player(string firstName, string lastName, string phoneNumber, string emailAddress, int numberOfExtraTeamsWillingToFill,
bool isActive, string inactiveReason, ListOfGrades gradesCurrentlyEnrolled, string playerNotes)
{
FirstName = firstName;
LastName = lastName;
PhoneNumber = phoneNumber;
EmailAddress = emailAddress;
NumberOfExtraTeamsWillingToFill = numberOfExtraTeamsWillingToFill;
IsActive = isActive;
InactiveReason = inactiveReason;
PlayerNotes = playerNotes;
GradesCurrentlyEnrolled = gradesCurrentlyEnrolled;
}
// IsPlayerFloating
public bool IsPlayerFloating
{
get
{
return (GradesCurrentlyEnrolled.Count == 0);
}
}
// GradesCurrentlyEnrolled
private ListOfGrades _gradesCurrentlyEnrolled;
public ListOfGrades GradesCurrentlyEnrolled
{
get { return _gradesCurrentlyEnrolled; }
set { _gradesCurrentlyEnrolled = value;} //SendPropertyChanged("GradesCurrentlyEnrolled"); }
}
}
这是用于序列化和反序列化的代码:
private void LoadAllPlayers()
{
ListOfPlayer _playersForSerial;
Player testPlayer;
XmlSerializer serializer = new XmlSerializer(typeof(Player));
StreamReader reader = new StreamReader(filename);
testPlayer = (Player)serializer.Deserialize(reader);
reader.Close();
Players.Add(new PlayerViewModel(testPlayer));
foreach (Player pv in _playersForSerial)
{
Players.Add(new PlayerViewModel());
}
}
public void SaveAllPlayers()
{
ListOfPlayer _playersForSerial = new ListOfPlayer();
//Creates a list of Players fromt eh ViewModels
foreach (PlayerViewModel pv in Players)
{
_playersForSerial.Add(pv.GetPlayer);
}
// Note that only the collection is serialized -- not the
// CollectionName or any other public property of the class.
XmlSerializer x = new XmlSerializer(typeof(ListOfPlayer));
TextWriter writer = new StreamWriter(filename);
x.Serialize(writer, _playersForSerial);
writer.Close();
}
这也是集合的代码:
[XmlRootAttribute("ListOfPlayers")]
public class ListOfPlayer : ObservableCollection<Player>
{
}
[XmlRoot("GradesList")]
public class ListOfGrades : List<Grades>
{
}
另外,成绩是一个枚举:
public enum Grades
{
PreK,
K,
First,
Second,
Third,
Fourth,
Fifth,
Sixth,
Seventh,
Eighth
}
再次感谢! 对不起,所有信息。
您应该像这样向xmlSerializer提供有关其他类型的信息:
XmlSerializer serializer = new XmlSerializer(typeof(Player),new []{typeof(ListOfGrades)});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.