




已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
XML序列化與反序列化 整理文檔 XML序列化與反序列化 / OBJECT - XML public static void SaveXml(string filePath, object obj) SaveXml(filePath, obj, obj.GetType(); public static void SaveXml(string filePath, object obj, System.Type type) using (System.IO.StreamWriter writer = new System.IO.StreamWriter(filePath) System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(type); xs.Serialize(writer, obj); writer.Close(); / XML - OBJECT public static object LoadXml(string filePath, System.Type type) if (!System.IO.File.Exists(filePath) return null; using (System.IO.StreamReader reader = new System.IO.StreamReader(filePath) System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(type); object obj = xs.Deserialize(reader); reader.Close(); return obj; 相關(guān)的常用Attribute(命名空間System.Xml.Serialization ) XmlRootAttribute(PurchaseOrder, Namespace=/, IsNullable=false) / 指定根 XmlIgnoreAttribute / 跳過(guò)不序列化 XmlArrayAttribute(Items) public OrderedItem OrderedItems; / 層次序列化: . XmlElementAttribute(ElementName=Link, IsNullable=false) public Link Links; / 平面序列化: . XmlAttribute(Cat) public string Cat; / 表現(xiàn)為屬性 XmlElementAttribute(IsNullable=false) / 表現(xiàn)為節(jié)點(diǎn).相關(guān)的全部Attribute(命名空間System.Xml.Serialization ) XmlAttributes 表示一個(gè)特性對(duì)象的集合,這些對(duì)象控制 XmlSerializer 如何序列化和反序列化對(duì)象。 XmlArrayAttribute 指定 XmlSerializer 應(yīng)將特定的類(lèi)成員序列化為 XML 元素?cái)?shù)組。 XmlArrayItemAttribute 指定 XmlSerializer 可以放置在序列化數(shù)組中的派生類(lèi)型。 XmlArrayItemAttributes 表示 XmlArrayItemAttribute 對(duì)象的集合。 XmlAttributeAttribute 指定 XmlSerializer 應(yīng)將類(lèi)成員作為 XML 特性序列化。 XmlChoiceIdentifierAttribute 指定可以通過(guò)使用枚舉來(lái)進(jìn)一步消除成員的歧義。 XmlElementAttribute 在 XmlSerializer 序列化或反序列化包含對(duì)象時(shí),指示公共字段或?qū)傩员硎?XML 元素。 XmlElementAttributes 表示 XmlElementAttribute 的集合,XmlSerializer 將其用于它重寫(xiě)序列化類(lèi)的默認(rèn)方式。 XmlEnumAttribute 控制 XmlSerializer 如何序列化枚舉成員。 XmlIgnoreAttribute 指示 XmlSerializer 的 Serialize 方法不序列化公共字段或公共讀/寫(xiě)屬性值。 XmlIncludeAttribute 允許 XmlSerializer 在它序列化或反序列化對(duì)象時(shí)識(shí)別類(lèi)型。 XmlRootAttribute 控制視為 XML 根元素的屬性目標(biāo)的 XML 序列化。 XmlTextAttribute 當(dāng)序列化或反序列化包含類(lèi)時(shí),向 XmlSerializer 指示應(yīng)將此成員作為 XML 文本處理。 XmlTypeAttribute 控制當(dāng)屬性目標(biāo)由 XmlSerializer 序列化時(shí)生成的 XML 架構(gòu)。 XmlAnyAttributeAttribute 指定成員(返回 XmlAttribute 對(duì)象的數(shù)組的字段)可以包含任何 XML 屬性。 XmlAnyElementAttribute 指定成員(返回 XmlElement 或 XmlNode 對(duì)象的數(shù)組的字段)可以包含對(duì)象,該對(duì)象表示在序列化或反序列化的對(duì)象中沒(méi)有相應(yīng)成員的所有 XML 元素。 XmlAnyElementAttributes 表示 XmlAnyElementAttribute 對(duì)象的集合。 XmlAttributeEventArgs 為 UnknownAttribute 事件提供數(shù)據(jù)。 XmlAttributeOverrides 允許您在使用 XmlSerializer 序列化或反序列化對(duì)象時(shí)重寫(xiě)屬性、字段和類(lèi)特性。 XmlElementEventArgs 為 UnknownElement 事件提供數(shù)據(jù)。 XmlNamespaceDeclarationsAttribute 指定目標(biāo)屬性、參數(shù)、返回值或類(lèi)成員包含與 XML 文檔中所用命名空間關(guān)聯(lián)的前綴。 XmlNodeEventArgs 為 UnknownNode 事件提供數(shù)據(jù)。 XmlSerializer 將對(duì)象序列化到 XML 文檔中和從 XML 文檔中反序列化對(duì)象。XmlSerializer 使您得以控制如何將對(duì)象編碼到 XML 中。 XmlSerializerNamespaces 包含 XmlSerializer 用于在 XML 文檔實(shí)例中生成限定名的 XML 命名空間和前綴。 XmlTypeMapping 包含從一種類(lèi)型到另一種類(lèi)型的映射。 xml序列化答疑 (1)需序列化的字段必須是公共的(public) (2)需要序列化的類(lèi)都必須有一個(gè)無(wú)參的構(gòu)造函數(shù) (3)枚舉變量可序列化為字符串,無(wú)需用XmlInclude (4)導(dǎo)出非基本類(lèi)型對(duì)象,都必須用XmlInclude事先聲明。該規(guī)則遞歸作用到子元素 如導(dǎo)出ArrayList對(duì)象,若其成員是自定義的,需預(yù)包含處理: using System.Xml.Serialization; XmlInclude(typeof(自定義類(lèi)) (5)Attribute中的IsNullable參數(shù)若等于false,表示若元素為null則不顯示該元素。 也就是說(shuō):針對(duì)值類(lèi)型(如結(jié)構(gòu)體)該功能是實(shí)效的 若數(shù)組包含了100個(gè)空間,填充了10個(gè)類(lèi)對(duì)象,則序列化后只顯示10個(gè)節(jié)點(diǎn) 若數(shù)組包含了100個(gè)空間,填充了10個(gè)結(jié)構(gòu)體對(duì)象,則序列化后會(huì)顯示100個(gè)節(jié)點(diǎn) (6)真正無(wú)法XML序列化的情況 某些類(lèi)就是無(wú)法XML序列化的(即使使用了XmlInclude) IDictionary(如HashTable) System.Drawing.Color System.Drawing.Font SecurityAttribute聲明 父類(lèi)對(duì)象賦予子類(lèi)對(duì)象值的情況 對(duì)象間循環(huán)引用 (7)對(duì)于無(wú)法XML序列化的對(duì)象,可考慮 使用自定義xml序列化(實(shí)現(xiàn)IXmlSerializable接口) 實(shí)現(xiàn)IDictionary的類(lèi),可考慮(1)用其它集合類(lèi)替代;(2)用類(lèi)封裝之,并提供Add和this函數(shù) 某些類(lèi)型需要先經(jīng)過(guò)轉(zhuǎn)換,然后才能序列化為 XML。如XML序列化System.Drawing.Color,可先用ToArgb()將其轉(zhuǎn)換為整數(shù) 過(guò)于復(fù)雜的對(duì)象用xml序列化不便的話,可考慮用二進(jìn)制序列化 -高級(jí)議題-序列化中異常的撲捉 使用Exception.Message只會(huì)得到簡(jiǎn)單的信息“行*錯(cuò)誤 可以使用Exception.InnerException.Message得到更詳盡的信息可使用事件代理來(lái)處理解析不了的XML節(jié)點(diǎn) XmlSerializer serializer = new XmlSerializer(typeof(PurchaseOrder); serializer.UnknownNode+= new XmlNodeEventHandler(serializer_UnknownNode); serializer.UnknownAttribute+= new XmlAttributeEventHandler(serializer_UnknownAttribute); protected void serializer_UnknownNode(object sender, XmlNodeEventArgs e) Console.WriteLine(Unknown Node: + e.Name + t + e.Text); protected void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e) System.Xml.XmlAttribute attr = e.Attr; Console.WriteLine(Unknown attribute + attr.Name + = + attr.Value + ); 集合類(lèi)(IEnumerable, ICollection)必須滿足下列規(guī)則才可XML序列化: - 不得實(shí)現(xiàn) IDictionary。 - 必須有一個(gè) Add 方法,該方法不是由該接口定義的,因?yàn)樗ǔJ菫樵摷蠈⒁菁{的專(zhuān)用類(lèi)型而創(chuàng)建的 - 必須有一個(gè)索引器, 且參數(shù)為 System.Int32 (C# int) - 在 Add、Count 和索引器中不能有任何安全特性(SecurityAttribute) 可序列化集合類(lèi)例程: public class PublisherCollection : CollectionBase public int Add(Publisher value) return base.InnerList.Add(value); public Publisher thisint idx get return (Publisher) base.InnerListidx; set base.InnerListidx = value; 某些類(lèi)是以程序集的形式提供的,無(wú)法修改其源碼。可用XmlAttributeOverrides設(shè)置其序列化特性 XML目標(biāo) 100 Product Thing 10 101 How to Use Your New Product Thing 10 123456789 源類(lèi)(無(wú)法修改) public class Inventory private Product stuff; public Inventory() public Product InventoryItems get return stuff; set stuff=value; 附加X(jué)mlAttributeOverrides后即可序列化 XmlAttributes attrs = new XmlAttributes(); attrs.XmlElements.Add(new XmlElementAttribute(Book, typeof(BookProduct); attrs.XmlElements.Add(new XmlElementAttribute(Product, typeof(Product); /add to the Attributes collection XmlAttributeOverrides attrOver = new XmlAttributeOverrides(); attrOver.Add(typeof(Inventory), InventoryItems, attrs); /deserialize and load data into the listbox from deserialized object FileStream f=new FileStream(.inventory.xml,FileMode.Open); XmlSerializer newSr=new XmlSerializer(typeof(Inventory), attrOver); Inventory newInv = (Inventory)newSr.Deserialize(f);-最簡(jiǎn)單的示例-類(lèi)設(shè)計(jì) public class MyClass public MyObject MyObjectProperty; public class MyObject public string ObjectName;序列化的 XML: My String -示例: 序列化數(shù)組,并限制數(shù)組元素類(lèi)型-類(lèi)設(shè)計(jì) public class Things XmlElement(DataType = typeof(string), XmlElement(DataType = typeof(int) public object StringsAndInts; 生成的 XML 可能為: Hello 999 World -示例: 序列化數(shù)組-類(lèi)設(shè)計(jì) using System.Xml.Serialization; XmlRootAttribute(LinkLibrary, IsNullable = false, Namespace=/) public class LinkLib XmlElementAttribute(ElementName=Link, IsNullable=false) public Link Links; public LinkLib() Links = new Link50; Links0 = new Link(aa, aa, aa); Links1 = new Link(bb, aa, aa); Links2 = new Link(cc, aa, aa); Links3 = new Link(aa, aa, aa); Links4 = new Link(aa, aa, aa); Links5 = new Link(aa, aa, aa); Links6 = new Link(aa, aa, aa); Links7 = new Link(aa, aa, aa); Links8 = new Link(aa, aa, aa); Links9 = new Link(aa, aa, aa); public class Link XmlAttribute(Cat) public string Cat; XmlAttribute(Url) public string Url; XmlAttribute(Desc)public string Desc; public Link() public Link(string cat, string url, string desc) Cat = cat; Url = url; Desc = desc; 目標(biāo)XML文件 若使用XmlArrayAttribute(Links) public Link Links;則序列化后的xml文件會(huì)多出一層: -示例:使用自定義序列化序列化Dictionary對(duì)象-XML目標(biāo) FactTableDef1 owner1 sourceTable1 類(lèi)源碼 using System; using System.Collections.Generic; using System.Text; using System.Runtime.Serialization; using System.Xml; using System.Xml.Serialization; namespace WZDM.OLAP System.Serializable() XmlInclude(typeof(FactTableDef) public class FactTableDef : System.Xml.Serialization.IXmlSerializable public string Name; / 名稱(chēng) public string Owner; / 事實(shí)表屬主 public string SourceTable; / 源表 public Dictionary ColumnMeasureMaps; / 字段和量度對(duì)應(yīng)關(guān)系 public Dictionary ColumnDimensionMaps; / 字段和維度對(duì)應(yīng)關(guān)系 public FactTableDef() . public void WriteXml(System.Xml.XmlWriter writer) writer.WriteElementString(Name, this.Name); writer.WriteElementString(Owner, this.Owner); writer.WriteElementString(SourceTable, this.SourceTable); / ColumnMeasureMaps writer.WriteStartElement(ColumnMeasureMaps); foreach (string key in this.ColumnMeasureMaps.Keys) writer.WriteStartElement(Map); writer.WriteAttributeString(Column, key); writer.WriteAttributeString(Measure, ColumnMeasureMapskey); writer.WriteEndElement(); writer.WriteEndElement(); / ColumnDimensionMaps writer.WriteStartElement(ColumnDimensionMaps); foreach (string key in this.ColumnDimensionMaps.Keys) writer.WriteStartElement(Map); writer.WriteAttributeString(Column, key); writer.WriteAttributeString(Dimension, ColumnDimensionMapskey); writer.WriteEndElement(); writer.WriteEndElement(); public void ReadXml(System.X
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 校園電子手機(jī)管理制度
- 校園美化建設(shè)管理制度
- 校園門(mén)衛(wèi)職責(zé)管理制度
- 校園食堂智慧管理制度
- 2024年心臟除顫器項(xiàng)目資金籌措計(jì)劃書(shū)代可行性研究報(bào)告
- 2024年海水淡化設(shè)備項(xiàng)目資金申請(qǐng)報(bào)告代可行性研究報(bào)告
- 活性氯協(xié)同氧化工藝-洞察及研究
- 創(chuàng)新文化培育機(jī)制-洞察及研究
- 物流行業(yè)實(shí)習(xí)表現(xiàn)證明(7篇)
- 英語(yǔ)專(zhuān)業(yè)翻譯技巧閱讀題
- 2023年重慶市銅梁區(qū)物理八下期末質(zhì)量跟蹤監(jiān)視模擬試題(含解析)
- 中國(guó)華電集團(tuán)公司信訪事項(xiàng)處理程序
- 特種設(shè)備制造內(nèi)審及管理評(píng)審資料匯編經(jīng)典版
- 教師壓力管理(教育心理健康C證培訓(xùn))課件
- 工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)使用手冊(cè)
- 網(wǎng)絡(luò)暴力主題班會(huì)PPT課件講義
- 《工程管理指導(dǎo)書(shū)》word版
- 合理低價(jià)法得分計(jì)算
- 關(guān)于涉農(nóng)企業(yè)稅收風(fēng)險(xiǎn)管理的實(shí)踐和思考
- 05S502閥門(mén)井圖集
- 輪扣式支架模板施工方案
評(píng)論
0/150
提交評(píng)論