2017-09-22 3 views
3

Je stocke les éléments affichés sur ma page d'accueil sous la forme d'une chaîne XML (dans les paramètres).Quelle est la manière correcte de désérialiser cette chaîne XML?

<?xml version=""1.0""?> 
<HomePageItemList> 
    <PlantHomePageItem> 
     <Name>Plant1</Name> 
    </PlantHomePageItem> 
    <PlantHomePageItem> 
     <Name>Plant2</Name> 
    </PlantHomePageItem> 
    <AdminHomePageItem> 
     <Name>Admin1</Name> 
    </AdminHomePageItem> 
</HomePageItemList> 

Certains éléments représentent une plante PlantHomePageItem, d'autres un outil d'administration AdminHomePageItem. Héritent toutes deux de la même classe de base HomePageItem

[XmlRoot("HomePageItemList")] 
public class TestSerialization 
{ 
    [XmlArray("HomePageItemList")] 
    [XmlArrayItem("PlantHomePageItem", Type = typeof(PlantHomePageItem))] 
    [XmlArrayItem("AdminHomePageItem", Type = typeof(AdminHomePageItem))] 
    public List<HomePageItem> HomePageItemList { get; set; } 
} 

[XmlInclude(typeof(PlantHomePageItem))] 
[XmlInclude(typeof(AdminHomePageItem))] 
public class HomePageItem 
{ 
    [XmlElement("Name")] 
    public string Name { get; set; } 
} 

public class PlantHomePageItem : HomePageItem { } 
public class AdminHomePageItem : HomePageItem { } 

Lorsque je tente une deserialize, je n'ai aucune erreur d'exécution, juste un objet vide ...

MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(XML)); 
XmlSerializer xs = new XmlSerializer(typeof(TestSerialization)); 
TestSerialization obj = (TestSerialization)xs.Deserialize(ms); 

Console.WriteLine(obj.HomePageItemList.Count); 

foreach (var item in obj.HomePageItemList) 
{ 
    Console.WriteLine("{0}: {1}", item.GetType().Name, item.Name); 
} 

retours

0 

A .NET Fiddle avec le tout est disponible: https://dotnetfiddle.net/f51b0K

Répondre

4

Changer votre classe TestSerialization à cette ...

[XmlRoot("HomePageItemList")] 
public class TestSerialization 
{ 
    [XmlElement("PlantHomePageItem", Type = typeof(PlantHomePageItem))] 
    [XmlElement("AdminHomePageItem", Type = typeof(AdminHomePageItem))] 
    public List<HomePageItem> HomePageItemList { get; set; } 
} 

Your modified example...