2011-07-14 40 views
0

我有一個類:XML序列化的子類

public abstract class BaseClass 
{ 

} 

public class FirstChild:BaseClass 
{ 

} 

public class SecondChild:BaseClass 
{ 

} 

public class Request 
{ 
public BaseClass Child {get;set;} 

} 

我已經在所有的類添加Serializable屬性,其中包括在基類XmlInclude,則firstChild和secondchild類。

I want to achieve this: 
<Request> 
    <FirstChild/> 
</Request> 

<Request> 
    <SecondChild/> 
</Request> 

我創建一個使用要求:

Request request = new Request(); 
request.Child = new FirstChild(); 

然後序列化。

,但我不斷收到這樣的:

<Request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

<Type xsi:type="FirstChild"> 
</Type> 

</Request> 

能否請你點什麼我沒有做對嗎?

+0

您是否嘗試將屬性添加到您的類型?目前它是空的,因此可能無法序列化任何東西。 –

+0

你能告訴我們你的XmlInclude聲明嗎? –

+0

「然後序列化」。怎麼樣? XmlSerializer的?什麼設置? –

回答

0

你可以試試這段代碼..我還假設你的實際類有它們的屬性。

using (MemoryStream ms = new MemoryStream()) 
{ 
    XmlWriterSettings xrs = new XmlWriterSettings(); 
    xrs.Encoding = Encoding.UTF8; 
    using (XmlWriter writer = XmlWriter.Create(ms, xrs)) 
    { 
     XmlSerializer serializer = new XmlSerializer(obj.GetType()); 
     serializer.Serialize(writer, obj); 

     writer.Flush(); 
    } 

    using (StreamReader sr = new StreamReader(ms)) 
    { 
     ms.Position = 0; 
     xml = sr.ReadToEnd(); 
    } 
} 
0

我沒有看到任何簡單的方法來做到這一點。我想創建一個輔助類RequestMemento爲了這個目的:

using System; 
using System.IO; 
using System.Xml.Serialization; 
using System.ComponentModel; 

public abstract class BaseClass 
{} 

public class FirstChild:BaseClass 
{} 

public class SecondChild:BaseClass 
{} 

[XmlRoot("Request")] 
[XmlType("Request")] 
public class RequestMemento 
{ 
    [DefaultValue(null)] 
    public FirstChild First { get; set; } 

    [DefaultValue(null)] 
    public SecondChild Second { get; set; } 

    [XmlIgnore] 
    public BaseClass Child 
    { 
     get 
     { 
      return (BaseClass)First ?? (BaseClass)Second; 
     } 
     set 
     { 
      First = value as FirstChild; 
      Second = value as SecondChild; 
     } 
    } 
} 

class App 
{ 
    static void Main() 
    { 
     var memento = new RequestMemento(); 
     memento.Child = new FirstChild(); 

     XmlSerializer serializer = new XmlSerializer(typeof(RequestMemento)); 
     using (var writer = new StreamWriter("1.xml")) 
     { 
      serializer.Serialize(writer, memento); 
     } 
    } 
} 
5

爲了做到這一點,你需要使用XmlArrayItem或XmlElement的屬性。此外,如果您希望子類實例是您的子元素的子元素,那麼將Child屬性視爲長度爲1的BaseClass []會更容易。

因此,您的類將如下所示:

public abstract class BaseClass 
{ 

} 

public class FirstChild:BaseClass 
{ 

} 

public class SecondChild:BaseClass 
{ 

} 

public class Request 
{ 
     [XmlArrayItem(Type = typeof(FirstChild), ElementName = "FirstChild")] 
     [XmlArrayItem(Type = typeof(SecondChild), ElementName = "SecondChild")] 
     public BaseClass[] Child {get;set;} 

} 

這將導致您正在查找的XML。

+0

謝謝馬克,這是最合適的...... :) – Fabio