[英]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.