简体   繁体   English

在C#中反序列化XML嵌套集合

[英]Deserialize XML nested collections in C#

So I am having trouble when deserializing my XML that has nested collections in it. 因此,在反序列化具有嵌套集合的XML时遇到麻烦。 I was able to deserialize it before the nested collection(Grades) was added but have not been able to since. 在添加嵌套集合(Grades)之前,我能够反序列化它,但此后一直无法。 Any help would be great! 任何帮助将是巨大的!

Below is what the XML is serialized as: 以下是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>

Here is the Code for Player Class: 这是播放器类的代码:

 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"); }
    }

}

And this is the code for Serializing and deserializing: 这是用于序列化和反序列化的代码:

       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();
    }

Also here is the code for the collections: 这也是集合的代码:

[XmlRootAttribute("ListOfPlayers")]
public class ListOfPlayer : ObservableCollection<Player>
{
}

[XmlRoot("GradesList")]
public class ListOfGrades : List<Grades>
{
}

Also Grades is an enum: 另外,成绩是一个枚举:

public enum Grades
{
    PreK,
    K,
    First,
    Second,
    Third,
    Fourth,
    Fifth,
    Sixth,
    Seventh,
    Eighth
}

Thanks again! 再次感谢! Sorry for all the information. 对不起,所有信息。

您应该像这样向xmlSerializer提供有关其他类型的信息:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM