.net精簡框架集多個類同時序列化(XML方式)技術

weixin_33858249發表於2017-11-08

存取類例項的引數最佳的方法當然是序列化技術,序列化支援兩種方式:二進位制方式,可以高保真的儲存類示例,另一種是XML方式,它僅儲存公共資料。很可惜.net 2.0的精簡框架集僅支援XML方式。

      我這裡做了一個示例,實現的功能是在PC機上可以畫很多圖形,用序列化方式儲存相關資訊,把相關資訊下載到wince中,由wince中的c#程式讀取序列化資訊,並把相關類的例項資訊還原出來。

     這裡面有個關鍵,圖形類有可能有多個(示例為2個),而目前我查相關資料,都是一個類的序列化存取,並且如果你存兩個以上的類,用XML是可以存取成功的,但是讀取的時候它會告訴你失敗。所以這裡引入了ArrayList類的相關概念。

      也就是說,我定義了一個類,類中的一個屬性為ArrayList類的例項,這樣用ArrayList例項我可以儲存很多的類資訊。

      同樣,不作任何處理用一般方法儲存是成功的,但是在讀取時,你發現ArrayList例項中的資料,都是object型別,原型別資訊丟失!

      這怎麼辦?繼續查資料,發現有兩種方法可以解決這個問題。

      1、 


  1. [XmlElement(Type = typeof(YFRect)), XmlElement(Type = typeof(YFCircle))]  
  2.              public ArrayList gData = new ArrayList();          //圖後設資料 

              在類中新增XmlElement宣告,把ArrayList 類例項中有可能新增的類都標示出。

       2、在存取資料時,用程式碼告訴XML序列化相關類的型別

              


  1. Type[] gt = new Type[2];   //圖元型別陣列  
  2.             gt[0] = typeof(YFRect);  
  3.             gt[1] = typeof(YFCircle);  
  4.               
  5.             Stream sf = new FileStream(strXmlFile, FileMode.Open, FileAccess.Read, FileShare.None);  
  6.             XmlSerializer xmls = new XmlSerializer(typeof(YFGraphicsData), gt);  
  7.             XmlData = (YFGraphicsData)xmls.Deserialize(sf);  
  8.             sf.Close();  

      這是執行後的結果:

 

相關程式碼:clsGraphics.cs    (圖元類)

 


  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Collections;  
  5. using System.Drawing;  
  6. using System.Xml.Serialization;  
  7. using System.IO;  
  8. using System.Xml;  
  9.  
  10. namespace YFXMLSaveLoad  
  11. {     
  12.     //圖後設資料類  
  13.     public class YFGraphicsData  
  14.     {  
  15.         //[XmlElement(Type = typeof(YFRect)), XmlElement(Type = typeof(YFCircle))]  
  16.         //當程式碼傳入型別陣列時,則不需要上面的宣告  
  17.         public string strName = "測試";  
  18.         public string strVer = "V1.0.0";  
  19.         public ArrayList gData = new ArrayList();          //圖後設資料  
  20.          
  21.     }  
  22.  
  23.     //序列化操作類  
  24.     public class YFXMLSerialize  
  25.     {  
  26.         //序列化  
  27.         public void XMLSerializer(YFGraphicsData XmlData,string strXmlFile)  
  28.         {  
  29.             Type[] gt = new Type[2];  //圖元型別陣列  
  30.             gt[0] = typeof(YFRect);  
  31.             gt[1] = typeof(YFCircle);  
  32.  
  33.             Stream sf = new FileStream(strXmlFile, FileMode.Create, FileAccess.Write, FileShare.None);  
  34.             XmlSerializer xmls = new XmlSerializer(typeof(YFGraphicsData), gt);  
  35.             xmls.Serialize(sf, XmlData);  
  36.             sf.Close();  
  37.         }  
  38.  
  39.         //反序列化  
  40.         public void XMLDeserialize(out YFGraphicsData XmlData, string strXmlFile)  
  41.         {  
  42.             Type[] gt = new Type[2];   //圖元型別陣列  
  43.             gt[0] = typeof(YFRect);  
  44.             gt[1] = typeof(YFCircle);  
  45.               
  46.             Stream sf = new FileStream(strXmlFile, FileMode.Open, FileAccess.Read, FileShare.None);  
  47.             XmlSerializer xmls = new XmlSerializer(typeof(YFGraphicsData), gt);  
  48.             XmlData = (YFGraphicsData)xmls.Deserialize(sf);  
  49.             sf.Close();  
  50.         }         
  51.     
  52.     }  
  53.       
  54.     //------------------------------------------------  
  55.     public class YFGraphicsBase  
  56.     {       
  57.         public int  width = 1;  
  58.         //Color類不支援XML序列化  
  59.         public int color = 0;     
  60.         public virtual void Draw(Graphics e) { }  
  61.     }  
  62.  
  63.     public class YFRect : YFGraphicsBase  
  64.     {  
  65.         public Rectangle xy;  
  66.         public override void Draw(Graphics e)  
  67.         {  
  68.             e.DrawRectangle(new Pen(Color.FromArgb(color), width), xy);  
  69.         }  
  70.     }  
  71.  
  72.     public class YFCircle : YFGraphicsBase  
  73.     {  
  74.         public Rectangle xy;         
  75.         public override void Draw(Graphics e)  
  76.         {  
  77.             e.DrawEllipse(new Pen(Color.FromArgb(color), width), xy);  
  78.         }  
  79.     }  
  80.       
  81. }  
  82.  
  83. Form1.cs 窗體程式碼  
  84.  
  85. using System;  
  86. using System.Collections.Generic;  
  87. using System.ComponentModel;  
  88. using System.Data;  
  89. using System.Drawing;  
  90. using System.Text;  
  91. using System.Windows.Forms;  
  92. using System.Collections;  
  93. using System.Xml.Serialization;  
  94. using System.IO;  
  95. using System.Reflection;  
  96. using System.Runtime.InteropServices;  
  97.  
  98. namespace YFXMLSaveLoad  
  99. {  
  100.     public partial class Form1 : Form  
  101.     {  
  102.  
  103.         YFGraphicsData XmlData = new YFGraphicsData();    //圖後設資料  
  104.         YFXMLSerialize XmlWork = new YFXMLSerialize();    //XML序列化方法   
  105.  
  106.         public Form1()  
  107.         {  
  108.             InitializeComponent();  
  109.             panel1.Refresh();   
  110.         }  
  111.  
  112.         //自繪  
  113.         private void button4_Click(object sender, EventArgs e)  
  114.         {  
  115.             YFRect yfr001=new YFRect();  
  116.             YFRect  yfr002 = new YFRect();  
  117.             YFCircle yfc001 = new YFCircle();  
  118.  
  119.             yfr001.color = Color.Blue.ToArgb();    
  120.             yfr001.xy.X  = 10;  
  121.             yfr001.xy.Y   = 10;  
  122.             yfr001.xy.Width  = 50;  
  123.             yfr001.xy.Height   = 50;  
  124.  
  125.             yfr002.color = Color.FromArgb(0, 0, 0).ToArgb();   
  126.             yfr002.width = 2;  
  127.             yfr002.xy.X = 30;  
  128.             yfr002.xy.Y = 50;  
  129.             yfr002.xy.Width = 100;  
  130.             yfr002.xy.Height = 80;  
  131.  
  132.             yfc001.color = Color.Red.ToArgb();  
  133.             yfc001.xy.X = 20;  
  134.             yfc001.xy.Y = 20;  
  135.             yfc001.xy.Width = 80;  
  136.             yfc001.xy.Height = 90;  
  137.  
  138.             XmlData.gData.Clear();  
  139.             XmlData.gData.Add(yfr001);  
  140.             XmlData.gData.Add(yfc001);  
  141.             XmlData.gData.Add(yfr002);  
  142.  
  143.             panel1.Refresh();              
  144.  
  145.         }     
  146.  
  147.         //繪圖  
  148.         private void panel1_Paint(object sender, PaintEventArgs e)  
  149.         {  
  150.             e.Graphics.Clear(Color.PapayaWhip);  
  151.             foreach (YFGraphicsBase dw in XmlData.gData)  
  152.             {  
  153.                 dw.Draw(e.Graphics);                 
  154.             }  
  155.             textBox1.Text = XmlData.gData.Count.ToString();  
  156.         }  
  157.  
  158.         //清圖元  
  159.         private void button3_Click(object sender, EventArgs e)  
  160.         {  
  161.             XmlData.gData.Clear();  
  162.             panel1.Refresh();   
  163.         }  
  164.  
  165.         //儲存圖元  
  166.         private void button2_Click(object sender, EventArgs e)  
  167.         {  
  168.             //圖元序列化  
  169.             XmlWork.XMLSerializer(XmlData,"TuData.xml");  
  170.             //------   
  171.             MessageBox.Show("OK");    
  172.         }  
  173.  
  174.         //調入圖元  
  175.         private void button1_Click(object sender, EventArgs e)  
  176.         {  
  177.             //圖元反序列化  
  178.             XmlWork.XMLDeserialize(out XmlData, "TuData.xml");  
  179.             //------    
  180.             panel1.Refresh();   
  181.         }      
  182.  
  183.     }  
  184. }  
  185.  
  186. //-----------------------------------  
  187.  

 


















本文轉自yefanqiu51CTO部落格,原文連結:http://blog.51cto.com/yfsoft/323794,如需轉載請自行聯絡原作者

相關文章