序列化操作對於開發人員來說最熟悉不過了。
序列化分為:序列化和反序列化。
序列化名詞解釋:序列化是將對象狀態轉換為可保持或傳輸的格式的過程。
與序列化相對的是反序列化,它將流轉換為對象。這兩個過程結合起來,可以輕松地存儲和傳輸數據。這就是序列化的意義所在。
我們可以把對象序列化為不同的格式,比如說,Json序列化、XML序列化、二進制序列化、SOAP序列化等,以上這些不同的格式也都是為了適應具體的業務需求。
最近開發工作中需要一個xml序列化操作,
大概需求就是,有一個系統B提供了一個對外數據訪問接口,B系統只接收xml的格式數據。
在這里有兩種寫法:
1.拼湊成一個對應格式xml數據格式傳給B系統,那么這樣就有一個問題,在拼湊過程會遇到到轉義字符,那么要去解決轉義字符帶來的問題,效率上也不高,代碼看起來也很low.
2.實現序列化操作,這樣做效率是最高的,代碼美觀,很有層次結構,維護也方便。
接下來就是對於xml序列化的操作,很方便,適合開發中使用,我已經做成工具類,方便調用與移植。
1.創建一個工具文件夾Utils,創建一個類文件XmlUtils.cs
類具體代碼:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; using System.Xml.Serialization; namespace Myxs.Application.port.Utils { public static class XmlUtils { public static string Serialize<T>(this T obj, bool omitXmlDeclaration = false) { var sb = new StringBuilder(); using (var xw = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = omitXmlDeclaration, ConformanceLevel = ConformanceLevel.Auto, Indent = true })) { var xs = new XmlSerializer(obj.GetType()); xs.Serialize(xw, obj); } return sb.ToString(); } } }
接下來就是創建XmlModels文件夾,創建createInfoXml.cs的類,這里是設置需要序列化的xml元素
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Serialization; namespace Myxs.Application.port.XmlModels { [XmlRoot(ElementName = "apas_info")] public class createInfoXml { [XmlElement(ElementName = "serviceid")] public string Serviceid { get; set; } [XmlElement(ElementName = "projectname")] public string Projectname { get; set; } [XmlElement(ElementName = "applyname")] public string Applyname { get; set; } [XmlElement(ElementName = "mobile")] public string Mobile { get; set; } [XmlElement(ElementName = "phone")] public string Phone { get; set; } [XmlElement(ElementName = "address")] public string Address { get; set; } [XmlElement(ElementName = "postcode")] public string Postcode { get; set; } [XmlElement(ElementName = "email")] public string Email { get; set; } [XmlElement(ElementName = "contactman")] public string Contactman { get; set; } [XmlElement(ElementName = "legalman")] public string Legalman { get; set; } [XmlElement(ElementName = "idcard")] public string Idcard { get; set; } [XmlElement(ElementName = "create_time")] public string Create_time { get; set; } [XmlElement(ElementName = "receive_time")] public string Receive_time { get; set; } } }
現在萬事俱備只欠東風了。接下來就是使用工具類了,對xml進行序列化操作。
var model1 = new createInfoXml { Serviceid = entity.serviceid, Projectname = entity.projectname, Applyname = entity.applyname, Mobile = entity.mobile, Phone = entity.phone, Address = entity.address, Postcode = entity.postcode, Email = entity.email, Contactman = entity.contactman, Legalman = entity.legalman, Idcard = entity.idcard, Create_time = entity.create_time, Receive_time = entity.receive_time, };
后面是我創建的一個實體類,這個實體類可以自己創建,我就不在這里創建了。
調用工具類中的序列化方法
var dataxml = XmlUtils.Serialize(model1, true);
第二參數為true的原因就是我只需要xml的數據,不行了xml的頭文件,為true是為了去除xml頭文件。
最終效果圖如下:
<apas_info>
<serviceid>xx</serviceid>
<projectname>xx</projectname>
<applyname>xxx</applyname>
<mobile>xx</mobile>
.................
</apas_info>
這就完成序列化操作了。