XML 序列化 【译】
原文連接:http://www.diranieh.com/NETSerialization/XMLSerialization.htm
?
總結:
- 介紹
- XML 序列化示例
- XML Schema 定義文檔
- 通過 Attributes來控制XML 序列化
- 重寫XML 序列化
- XML Namespace
- XML 序列化和XML Web Service
?
介紹
序列化是指把對象轉化為可以持續存續或者跨流程/機器傳輸的過程。它的方向過程就是反序列化,就是把把序列化以后的文件轉換為原始的對象。.NET 提供了兩種序列化的技術:二進制和XML.
?
XML 序列化
XML 序列化可以序列化一個類的公有成員和屬性 或者參數,返回XML 數據流。XML 序列化不會序列化 方法,索引,私有成員 或者只讀屬性(除了只讀集合)。因為XML是一個公開標準,XML 數據流可以被任何平臺的應用傳輸。例如: ASP.NET Web Service 用XML 序列化創建XML 數據流 從而通過網絡來傳輸數據。相反的,反序列化用這種數據流來構建對象。
不相二進制序列化,XML 數列化不會保存類型,換句話說,它不會包含數據類型。比如:在公司命名空間里有一個員工對象,這個不能保證反序列化的對象有相同的類型。
用System.Xml.Serialization.Xmlserializer 來執行XML 序列化和反序列化。最重要的方法是Serialize 和 Deserialize。
創建類的時候,你可以直接用C#或者其他.NET語言代碼來寫一個類,或者用XML Schema Definition tool(xsd.exe)根據現有的XSD來生成類。 當一個來自XSD的類序列化了,把生成的XML 依附到XML Schema。你還可以選擇用.NET Framework中的其他類 比如 XmlReader和XmlWriter, 這兩個類可以用來解析任何XML 數據流。相反的,當你想要XML 數據流滿足XML Schema 你就可以用XmlSerializer。
用XmlSerializer生成xml數據流的時候 你可以設置XML的命名空間,元素名,屬性名.....XmlSerializer 類可以更進一步的數列化對象 生成 編碼的SOAP Xml 數據流。需要注意的是,XmlSerializer 類可以生成SOAP消息和傳到XML Web Service。
?
可序列化的項目:
以下的幾點是可以被XmlSerializer序列化的:
- 公有 可讀/可寫的屬性
- 公有成員
- 繼承了ICollection 或 IEnumerable的類
- XmlElement?對象
- XmlNode 對象
- DataSet 對象
用XML 序列化的優勢
用XmlSerialzer有比較完整的控制勸, 比如:
- 可以自定義成員或屬性是作為元素還是屬性
- 可以自定義XML的命名空間
- 假如成員/屬性的名字不合適,可以自定義元素或者屬性的名字
XML 序列化注意事項
以下是需要注意的地方:
- 不包含類型區別和assembly信息,如果要區分類別用二進制序列化
- 只有公有的屬性和成員可以被序列化,需要序列化非公有數據請用二進制序列化
- 如果需要序列化一個類,那么這個類一定要有默認構造函數
- 方法不能被序列化
- XmlSerialzer可以序列化繼承ICollection或者IEnumerable的類
例子
以下的例子展示額怎么序列化一個簡單的類,需要注意的是類必須要有默認構造函數:
namespace XMLSerialization {[Serializable()]public class MyBasicClass{public string strPublic;public MyBasicClass( ){strPublic = "hello";}} }?
// Serialization / Deserialization code uisng System.Xml.Serialization; ...private void btnXMLSerialization_Click(object sender, System.EventArgs e) {XMLSerializeMyBasicCObject();XMLDeSerializeMyBasicCObject(); }private void XMLSerializeMyBasicCObject() {// Create a serializable instnaceXMLSerialization.MyBasicClass ob = new XMLSerialization.MyBasicClass();// Initialize a storage medium to hold the serialized objectStream stream = new FileStream( "BasicXMLSerializa.xml", FileMode.Create, FileAccess.Write, FileShare.Write);// Serialize an object into the storage medium referenced by 'stream' object.XmlSerializer xmlserializer = new XmlSerializer( typeof(XMLSerialization.MyBasicClass) );xmlserializer.Serialize( stream, ob );// Cleanup stream.Close(); }private void XMLDeSerializeMyBasicCObject() {// Read the file back into a streamStream stream = new FileStream( "BasicXMLSerializa.xml", FileMode.Open, FileAccess.Read, FileShare.Read);// Now create a binary formatterXmlSerializer xmlserializer = new XmlSerializer( typeof(XMLSerialization.MyBasicClass) );// Deserialize the object and use itXMLSerialization.MyBasicClass ob = (XMLSerialization.MyBasicClass)xmlserializer.Deserialize( stream );Trace.WriteLine( ob.strPublic );// Cleanup stream.Close(); }結果如下:
<?xml version="1.0"?> <MyBasicClass xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><strPublic>hello</strPublic> </MyBasicClass>?
DataSet 序列化
以下展示了怎么序列化DataSet:
private void btnDataSet_Click(object sender, System.EventArgs e) {// Construct a DataSetSystem.Data.DataSet ds = new DataSet( "MyDataSet" );System.Data.DataTable dt = new DataTable( "MyDataTable" );System.Data.DataColumn dc1 = new DataColumn( "ID", typeof (int) );System.Data.DataColumn dc2 = new DataColumn( "Name", typeof (string) );dt.Columns.Add( dc1 );dt.Columns.Add( dc2 );ds.Tables.Add( dt );// Add some rowsfor (int i = 0; i < 5; i ++){DataRow row = dt.NewRow();row[0] = i;row[1] = i.ToString();dt.Rows.Add ( row );}// Now serialize the DataSetSystem.Xml.Serialization.XmlSerializer serializer = new XmlSerializer( typeof( DataSet ) );Stream stream = new FileStream( "DataSet.xml", FileMode.CreateNew);serializer.Serialize( stream, ds );// Clean up stream.Close(); }結果如下:
<?xml version="1.0"?> <DataSet><xs:schema id="MyDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"><xs:element name="MyDataSet" msdata:IsDataSet="true" msdata:Locale="en-GB"><xs:complexType><xs:choice maxOccurs="unbounded"><xs:element name="MyDataTable"><xs:complexType><xs:sequence><xs:element name="ID" type="xs:int" minOccurs="0" /><xs:element name="Name" type="xs:string" minOccurs="0" /></xs:sequence></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><MyDataSet><MyDataTable diffgr:id="MyDataTable1" msdata:rowOrder="0" diffgr:hasChanges="inserted"><ID>0</ID><Name>0</Name></MyDataTable><MyDataTable diffgr:id="MyDataTable2" msdata:rowOrder="1" diffgr:hasChanges="inserted"><ID>1</ID><Name>1</Name></MyDataTable><MyDataTable diffgr:id="MyDataTable3" msdata:rowOrder="2" diffgr:hasChanges="inserted"><ID>2</ID><Name>2</Name></MyDataTable><MyDataTable diffgr:id="MyDataTable4" msdata:rowOrder="3" diffgr:hasChanges="inserted"><ID>3</ID><Name>3</Name></MyDataTable><MyDataTable diffgr:id="MyDataTable5" msdata:rowOrder="4" diffgr:hasChanges="inserted"><ID>4</ID><Name>4</Name></MyDataTable></MyDataSet></diffgr:diffgram> </DataSet>?
復雜對象序列化
假如類的屬性或是成員返回復雜對象(array 或者實例,XmlSerializer會把它轉化為嵌套在xml文件里的成員,如下:
?
// Classes used in serializing. An Order object contains 0 or more Item objects namespace XMLSerialization {[Serializable]public class Item{public string strProductName;public int nProductID;public Item(){strProductName = "";nProductID = 0; }public Item( string s, int n ){strProductName = s;nProductID = n;}}[Serializable]public class Order{// Must indicate what kind of elements exist in the ArrayList. See// Controlling XML Serialization Through Attributes[XmlElement( typeof(Item) )]public ArrayList alOrders;public Order(){alOrders = new ArrayList();}[XmlInclude( typeof( Item) )]public void Add( Item i ){alOrders.Add( i );}} }?
// The function creates an Order that contains many Items and then serializes the Order object private void btnComplexOb_Click(object sender, System.EventArgs e) {Stream stream = null;try{// Create an object that contains other objectsXMLSerialization.Order order = new XMLSerialization.Order();order.Add( new XMLSerialization.Item( "Apples", 10 ) );order.Add( new XMLSerialization.Item( "Oranges", 20 ) );order.Add( new XMLSerialization.Item( "Avocados", 30 ) );// Now serialize the classSystem.Xml.Serialization.XmlSerializer serializer = new XmlSerializer( typeof( XMLSerialization.Order ) );stream = new FileStream( "ComplexObject.xml", FileMode.Create );serializer.Serialize( stream, order );stream.Close();}catch( Exception ex ){stream.Close();Trace.WriteLine ( ex.Message );} } <?xml version="1.0"?> <Order xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><alOrders><strProductName>Apples</strProductName><nProductID>10</nProductID></alOrders><alOrders><strProductName>Oranges</strProductName><nProductID>20</nProductID></alOrders><alOrders><strProductName>Avocados</strProductName><nProductID>30</nProductID></alOrders> </Order>?
?
?
?
?
轉載于:https://www.cnblogs.com/Jenny90/p/3593413.html
總結
以上是生活随笔為你收集整理的XML 序列化 【译】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动master 数据库
- 下一篇: wpf Command 携带当前窗口