簡體   English   中英

反序列化返回空對象

[英]Deserialization returns empty objects

我想將XML文件反序列化為C#對象。 我的對象如下

[Serializable]
[XmlRoot(ElementName = "Collection")]
public class Collection
{
    public Collection() 
    {
        Artiesten = new List<Artiest>();
        Albums = new List<Album>();
        Nummers = new List<Nummer>();
    }
    [XmlElement("Artiesten")]
    public List<Artiest> Artiesten { get; set; }
    [XmlElement("Albums")]
    public List<Album> Albums { get; set; }
    [XmlElement("Nummers")]
    public List<Nummer> Nummers { get; set; }

}

[Serializable]
public class Artiest
{
    [XmlAttribute("artiestid")]
    public int ArtiestId { get; set; }
    [XmlElement(ElementName = "Naam")]
    public String Naam { get; set; }
    [XmlElement(ElementName = "Albums")]
    public List<Album> Albums { get; set; } 
}

[Serializable]
public class Nummer
{
[XmlAttribute("nummerid")]
    public int NummerId { get; set; }
    [XmlElement(ElementName = "titel")]
    public String Titel { get; set; }
    [XmlElement(ElementName = "duur")]
    public String Duration { get; set; }
}

我的XML是這樣的:

<Collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Artiesten>
    <Artiest artiestid="1">
      <Naam>Harry</Naam>
      <Albums>
        <Album albumid="1">
          <Titel>Album1</Titel>
          <prijs valuta="Euro">19.99</prijs>
          <uitgiftejaar>1999</uitgiftejaar>
          <Nummers>
            <Nummer nummerid="1">
              <titel>happy Sundays</titel>
              <duur>PT02M02S</duur>
            </Nummer>
          </Nummers>
        </Album>
      </Albums>
    </Artiest>
  </Artiesten>
  <Albums>
    <Album albumid="1">
      <Titel>Album1</Titel>
      <prijs valuta="Euro">19.99</prijs>
      <uitgiftejaar>1999</uitgiftejaar>
      <Nummers>
        <Nummer nummerid="1">
          <titel>Happy Sundays</titel>
          <duur>PT02M02S</duur>
        </Nummer>
      </Nummers>
    </Album>
  </Albums>
  <Nummers>
    <Nummer nummerid="1">
      <titel>Happy Sundays</titel>
      <duur>PT02M02S</duur>
    </Nummer>
  </Nummers>
</Collection>

我正在嘗試像這樣進行反序列化:

XDocument doc = XDocument.Load(file);
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(Collection));
                using (var reader = doc.Root.CreateReader())
                {
                    Collection collection = (Collection) xmlSerializer.Deserialize(reader);

                }

由於某種原因,我找不到Collection對象中的列表都是空的。 調試顯示XDocument加載的文件有效。

編輯:我設法縮小問題。 它確實正確地反序列化了列表,只有那些列表中Object的所有屬性都是空的。

找到我的答案

我必須編輯我的列表屬性:

    [XmlElement("Artiesten", typeof(List<Artiest>))]
    public List<Artiest> Artiesten { get; set; }
    [XmlElement("Albums", typeof(List<Album>))]
    public List<Album> Albums { get; set; }
    [XmlElement("Nummers", typeof(List<Nummer>))]
    public List<Nummer> Nummers { get; set; }
Collection collection = null;
string path = "file.xml";

XmlSerializer serializer = new XmlSerializer(typeof(Collection));

StreamReader reader = new StreamReader(path);
collection = (Collection)serializer.Deserialize(reader);
reader.Close();

您需要從列表中[XmlElement]標簽。 否則,它將與其他XML結構一起使用。

例如,與其將所有Artiest對象嵌套在一個Artiesten元素(這是當前XML)中, Artiesten將它們設置為彼此相鄰,如下所示:

  <Artiesten artiestid="1">
      <Naam>Harry</Naam>
      <Albums>
        <Album albumid="1">
          <Titel>Album1</Titel>
          <prijs valuta="Euro">19.99</prijs>
          <uitgiftejaar>1999</uitgiftejaar>
          <Nummers>
            <Nummer nummerid="1">
              <titel>happy Sundays</titel>
              <duur>PT02M02S</duur>
            </Nummer>
          </Nummers>
        </Album>
      </Albums>
  </Artiesten>
  <Artiesten artiestid="2">
      <Naam>Harry</Naam>
      <Albums>
        <Album albumid="1">
          <Titel>Album1</Titel>
          <prijs valuta="Euro">19.99</prijs>
          <uitgiftejaar>1999</uitgiftejaar>
          <Nummers>
            <Nummer nummerid="1">
              <titel>happy Sundays</titel>
              <duur>PT02M02S</duur>
            </Nummer>
          </Nummers>
        </Album>
      </Albums>
  </Artiesten>
  <Artiesten artiestid="3">
      <Naam>Harry</Naam>
      <Albums>
        <Album albumid="1">
          <Titel>Album1</Titel>
          <prijs valuta="Euro">19.99</prijs>
          <uitgiftejaar>1999</uitgiftejaar>
          <Nummers>
            <Nummer nummerid="1">
              <titel>happy Sundays</titel>
              <duur>PT02M02S</duur>
            </Nummer>
          </Nummers>
        </Album>
      </Albums>
  </Artiesten>

因此,嘗試像這樣重新定義您的類:

[Serializable]
[XmlRoot(ElementName = "Collection")]
public class Collection
{
    public Collection() 
    {
        Artiesten = new List<Artiest>();
        Albums = new List<Album>();
        Nummers = new List<Nummer>();
    }

    public List<Artiest> Artiesten { get; set; }
    public List<Album> Albums { get; set; }
    public List<Nummer> Nummers { get; set; }

}

[Serializable]
public class Artiest
{
    [XmlAttribute("artiestid")]
    public int ArtiestId { get; set; }
    [XmlElement(ElementName = "Naam")]
    public String Naam { get; set; }

    public List<Album> Albums { get; set; } 
}

您需要XmlArray,而不是XmlElement:

[XmlArray("Artiesten")]
[XmlArrayItem("Artiest")]
public List<Artiest> ...

實際上,這是列表的默認行為,因此您也只需完全刪除該屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM