任務排程系統需支援多種任務型態,各擁不同配置結構。XML 序列化要求預知型別,本文提出「延遲反序列化」模式:先以 XmlNode[] 暫存擴展區段,使用時再依實際型別反序列化。
| 方案 | 優點 | 缺點 |
|---|---|---|
| XPath 直接讀 | 靈活、無型別綁定 | 程式碼冗長、易拼錯節點名 |
| 完整序列化 | 強型別、自動映射 | 需預知所有型別、擴充困難 |
| 延遲反序列化 | 兼具彈性與強型別 | 雙重序列化效能開銷 |
[Serializable, XmlRoot(ElementName = "configuration")]
public class XmlConfig
{
[XmlElement("extend")]
public object Extend { get; set; }
public T GetExtend<T>() where T : class
{
return Serializer.XmlDeserializerFormText<T>(ExtendRawXml);
}
protected string ExtendRawXml
{
get
{
var nodes = Extend as XmlNode[];
if (nodes == null || nodes.Length == 0) return "<extend />";
var w = new StringWriter();
using (var writer = new XmlTextWriter(w))
{
writer.WriteStartElement("extend");
foreach (var node in nodes) writer.WriteRaw(node.OuterXml);
writer.WriteEndElement();
}
return w.ToString();
}
}
}
[Serializable, XmlRoot("extend")]
public class MyExtend
{
public int Id { get; set; }
public string Name { get; set; }
}
var config = Serializer.XmlDeserializerFormText<XmlConfig>(xmlText);
var myExtend = config.GetExtend<MyExtend>(); // 實際使用時才反序列化
Console.WriteLine(myExtend.Name);
透過 object 暫存 XmlNode[],延遲至呼叫端決定具體型別,在彈性與型別安全間取得平衡。