標籤:main str com [] 資訊 輸出 來源 actor 設定檔
.Net Framework提供了對應的System.Xml.Seriazliation.XmlSerializer負責把對象序列化到XML,和從XML中還原序列化為對象。Serializer的使用比較直觀,需要多注意的是XML序列化相關的Attribute,怎麼把這些attribute應用到我們的對象,以及對象公用屬性上面去,產生滿足預期格式的XML。
需求來源於一檔案轉換項目,將一個XML格式的檔案轉換成另一種格式。公司的架構也大量使用了XmlSerializer來處理系統裡大量配置,每一個檔案設定檔對應一種類型的多個配置項。
關鍵知識點
序列化常用Attribute講解說明:
[XmlRootAttribute("MyCity", Namespace="abc.abc", IsNullable=false)] // 當該類為Xml根節點時,以此為根節點名稱。
public class City
[XmlAttribute("AreaName")] // 表現為Xml節點屬性。<... AreaName="..."/>
public string Name
[XmlElementAttribute("AreaId", IsNullable = false)] // 表現為Xml節點。<AreaId>...</AreaId>
public string Id
[XmlArrayAttribute("Areas")] // 表現為Xml階層,根為Areas,其所屬的每個該集合節點元素名為類名。<Areas><Area ... /><Area ... /></Areas>
public Area[] Areas
[XmlElementAttribute("Area", IsNullable = false)] // 表現為水平結構的Xml節點。<Area ... /><Area ... />...
public Area[] Areas
[XmlIgnoreAttribute] // 忽略該元素的序列化。
實際案例
類定義:
1) OrderEntity單據類XML裡是最頂層的Root節點。
/// <summary> /// 訂單資訊 /// </summary> [Serializable] [XmlRoot("Document")] public class OrderEntity { [XmlArray("Events"), XmlArrayItem("Event")] public OrderEvent[] Event { get; set; } }
2) OrderEvent單據類型(事件)描述實體
/// <summary> /// 單據類型(事件)描述資訊 /// </summary> [Serializable] public class OrderEvent { /// <summary> /// 單據名稱 /// </summary> [XmlAttribute("Name")] public string Name { get; set; } /// <summary> /// 庫存動作 /// </summary> [XmlAttribute("MainAction")] public string MainAction { get; set; } /// <summary> /// 單據明細項 /// </summary> [XmlArray("DataField"), XmlArrayItem("Data")] public OrderDetail[] details { get; set; } }
3)、資料明細類
/// <summary> /// 單據明細項目 /// </summary> [Serializable] public class OrderDetail { [XmlAttribute("Code")] public string Code { get; set; } [XmlAttribute("Actor")] public string Actor { get; set; } [XmlAttribute("ActDate")] public string ActDate { get; set; } [XmlAttribute("CorpOrderID")] public string CorpOrderID { get; set; } [XmlAttribute("FromCorpID")] public string FromCorpID { get; set; } [XmlAttribute("ToCorpID")] public string ToCorpID { get; set; } [XmlAttribute("OwnerID")] public string OwnerID { get; set; } }
4)序列化的實際代碼
#region 初始化訂單對象並完成序列化 OrderEntity result_File_Object = new OrderEntity { Event = new OrderEvent[] { new OrderEvent { Name =orderName , MainAction= dt_Event.Rows[0]["MainAction"].ToString(), details = query.Where(d => d.Code!=string.Empty).ToList().ToArray() } } }; Program.SerializerToXML<OrderEntity>(path + "\\" + fileName, result_File_Object); #endregion
/// <summary> /// 把對象序列化成xml檔案 /// </summary> /// <typeparam name="T">對象的類</typeparam> /// <param name="outFile">輸出的檔案和路徑</param> /// <param name="t">對象的執行個體</param> public static void SerializerToXML<T>(string outFile, T t) where T : class { using (System.IO.FileStream fs = new System.IO.FileStream(outFile, System.IO.FileMode.Create)) { XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); XmlSerializer xs = new XmlSerializer(typeof(T)); xs.Serialize(fs, t, ns); fs.Flush(); } }
實戰經驗分享之C#對象XML序列化