[英]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.