Так что у меня возникают проблемы при десериализации моего XML, в котором есть вложенные коллекции. Мне удалось десериализовать его до того, как была добавлена вложенная коллекция (Grades), но с тех пор она не была в состоянии. Любая помощь будет замечательной!Deserialize XML вложенные коллекции в C#
Ниже то, что 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>[email protected]</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>[email protected]</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
}
Еще раз спасибо! Извините за всю информацию.
Держите XMLRoot тег ListOfGrades же в качестве имени свойства в классе игроков. Это будет работать. В настоящее время ListOfGrades является искомым корневым узлом «GradesList», который не существует, но присутствует «GradesCurrentlyEnrolled», который является именем свойства. Избегайте предоставления XMlRoot ListOfGrades, это может решить проблему. – Akanksha
Кажется, что независимо от того, что XMLRoot ListOfGrades по-прежнему дает мне исключение XamlParseException при попытке и десериализации. Когда я выхожу через него, всегда разбивайтесь по адресу: testPlayer = (Player) serializer.Deserialize (reader); – user2914282