繁体   English   中英

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

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

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