簡體   English   中英

XML 序列化一個子 class

[英]XML serializing a sub class

我有一個 class:

public abstract class BaseClass
{

}

public class FirstChild:BaseClass
{

}

public class SecondChild:BaseClass
{

}

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

}

我在所有類上添加了可序列化屬性,並在 Baseclass、firstchild 和 secondchild 類中包含了 XmlInclude。

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>

你能指出我做錯了什么嗎?

為此,您需要使用 XmlArrayItem 或 XmlElement 屬性。 此外,如果您希望子類實例成為 Child 元素的子元素,則將 Child 屬性視為長度為 1 的 BaseClass[] 會更容易。

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

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。

你能試試這個代碼嗎..我也假設你的實際 class 有屬性。

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

我沒有看到任何簡單的方法來做到這一點。 為此,我將創建一個助手 class 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);
        }
    }
}

暫無
暫無

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

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