2013-11-26 3 views
0

Так что у меня возникают проблемы при десериализации моего 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 
} 

Еще раз спасибо! Извините за всю информацию.

+0

Держите XMLRoot тег ListOfGrades же в качестве имени свойства в классе игроков. Это будет работать. В настоящее время ListOfGrades является искомым корневым узлом «GradesList», который не существует, но присутствует «GradesCurrentlyEnrolled», который является именем свойства. Избегайте предоставления XMlRoot ListOfGrades, это может решить проблему. – Akanksha

+0

Кажется, что независимо от того, что XMLRoot ListOfGrades по-прежнему дает мне исключение XamlParseException при попытке и десериализации. Когда я выхожу через него, всегда разбивайтесь по адресу: testPlayer = (Player) serializer.Deserialize (reader); – user2914282

ответ

0

Вы должны предоставить информацию о дополнительных типов в XMLSerializer как это:

XmlSerializer serializer = new XmlSerializer(typeof(Player),new []{typeof(ListOfGrades)}); 
+0

Это генерирует исключение InvalidOperationException, когда оно пытается сериализовать игроков. – user2914282

Смежные вопросы