2017-09-22 3 views
3

私のホームページに表示されている項目をXML文字列(設定内)として保存します。このXML文字列を逆シリアル化する正しい方法は何ですか?

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

一部の項目は、植物PlantHomePageItem、他の管理ツールAdminHomePageItemを表します。どちらも、私はデシリアライズそれをしようとすると、私はランタイムエラー、ちょうど空のオブジェクト...

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

戻り

0 

Aを持っていない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 { } 

同じ基本クラスを継承します.NETフィドル全体が利用可能です:https://dotnetfiddle.net/f51b0K

答えて

4

...これにあなたのTestSerializationクラスを変更

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

Your modified example...

関連する問題