C# XML序列化辦法及經常使用特征總結剖析。本站提示廣大學習愛好者:(C# XML序列化辦法及經常使用特征總結剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C# XML序列化辦法及經常使用特征總結剖析正文
本文實例總結了C# XML序列化辦法及經常使用特征。分享給年夜家供年夜家參考,詳細以下:
C#對象XML序列化(一):序列化辦法和經常使用特征
.Net Framework供給了對應的System.Xml.Seriazliation.XmlSerializer擔任把對象序列化到XML,和從XML中反序列化為對象。Serializer的應用比擬直不雅,須要多留意的是XML序列化相干的Attribute,怎樣把這些attribute運用到我們的對象,和對象公共屬性下面去,生成知足預期格局的XML。
這裡列出了最經常使用的辦法和特征,涵蓋平常年夜部門的轉換任務,願望年夜家在任務中疾速上手。為了給年夜家直不雅的印象,這裡給出詳細的應用代碼,為了節儉篇幅,代碼異常處置沒有添加,列位同窗應用的時刻酌情添加。
1. Serializer辦法
上面的辦法封裝了XmlSerializer的挪用,這裡列出了參數最全的一個版本,詳細應用的時刻需恰當添減輕載:
public static class XmlSerializer { public static void SaveToXml(string filePath, object sourceObj, Type type, string xmlRootName) { if (!string.IsNullOrWhiteSpace(filePath) && sourceObj != null) { type = type != null ? type : sourceObj.GetType(); using (StreamWriter writer = new StreamWriter(filePath)) { System.Xml.Serialization.XmlSerializer xmlSerializer = string.IsNullOrWhiteSpace(xmlRootName) ? new System.Xml.Serialization.XmlSerializer(type) : new System.Xml.Serialization.XmlSerializer(type, new XmlRootAttribute(xmlRootName)); xmlSerializer.Serialize(writer, sourceObj); } } } public static object LoadFromXml(string filePath, Type type) { object result = null; if (File.Exists(filePath)) { using (StreamReader reader = new StreamReader(filePath)) { System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(type); result = xmlSerializer.Deserialize(reader); } } return result; } }
2. 序列化經常使用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] // 疏忽該元素的序列化。
3. 具體舉例解釋
這裡用簡略的城市,區域和街區作為例子,詳細示范一下下面的規矩。
[XmlRootAttribute("MyCity", Namespace = "abc.abc", IsNullable = false)] public class City { [XmlAttribute("CityName")] public string Name { get; set; } [XmlAttribute("CityId")] public string Id { get; set; } [XmlArrayAttribute("Areas")] public Area[] Areas { get; set; } } [XmlRootAttribute("MyArea")] public class Area { [XmlAttribute("AreaName")] public string Name { get; set; } [XmlElementAttribute("AreaId", IsNullable = false)] public string Id { get; set; } [XmlElementAttribute("Street", IsNullable = false)] public string[] Streets { get; set; } }
依據以上類型,我們mock一些數據,然後用步調1給出的Util辦法輸入:
static void Main(string[] args) { Area area1 = new Area(); area1.Name = "Pudong"; area1.Id = "PD001"; area1.Streets = new string [] { "street 001", "street 002" }; Area area2 = new Area(); area2.Name = "Xuhui"; area2.Id = "XH002"; area2.Streets = new string [] { "street 003", "street 004" }; City city1 = new City(); city1.Name = "Shanghai"; city1.Id = "SH001"; city1.Areas = new Area[] { area1, area2 }; XmlSerializer.SaveToXml(@"C:\temp\XML\output003.xml", city1); }
終究輸入的XML為:
<?xml version="1.0" encoding="utf-8"?> <MyCity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" CityName="Shanghai" CityId="SH001" xmlns="abc.abc"> <Areas> <Area AreaName="Pudong"> <AreaId>PD001</AreaId> <Street>street 001</Street> <Street>street 002</Street> </Area> <Area AreaName="Xuhui"> <AreaId>XH002</AreaId> <Street>street 003</Street> <Street>street 004</Street> </Area> </Areas> </MyCity>
上面我們開端詳細剖析成果,個中包括一些很有效的結論和留意事項:
1. xml的版本,編碼,和定名空間xmlns:xsi,xmlns:xsd為Framework主動添加。
2. 由於我們用City對象作為根節點,所以根節點稱號為我們界說的"MyCity"。
然則,留意!這裡指的是用City本身直接做根節點,假如是City聚集好比City[],此時,該稱號掉效,體系會主動生成稱號ArrayOfCity作為根節點稱號(ArrayOf+類名),或許我們手動指命名稱,這個就是在給年夜家的SaveToXml()辦法中,參數xmlRootName的感化。
3. 假如以City為根節點並在XmlRootAttribute特征中給命名稱,同時也手動指定了xmlRootName,體系會以手動指定的稱號為准。
4. AreaName,AreaId,同為Area類的公共屬性,一個被說明成屬性,一個被說明成子節點。
Areas聚集被說明成了條理構造,Streets聚集被說明成了程度構造。
這兩組差別最能表現分歧序列化Attribute的用法。
PS:小編這裡再來為年夜家推舉幾款關於xml操作的在線對象供年夜家無償使用。信任在今後開辟中可以用的到:
在線XML格局化/緊縮對象:
http://tools.jb51.net/code/xmlformat
在線XML/JSON相互轉換對象:
http://tools.jb51.net/code/xmljson
xml代碼在線格局化丑化對象:
http://tools.jb51.net/code/xmlcodeformat
HTML/XML本義字符對比表:
http://tools.jb51.net/table/html_escape
願望本文所述對年夜家C#法式設計有所贊助。