.net精简框架集多个类同时串行化(XML方式)技术

存取类实例的参数最佳的方法当然是串行化技术,串行化支持两种方式:二进制方式,可以高保真的保存类示例,另一种是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.  

 

本文出自 “叶帆工作室” 博客,转载请与作者联系!

你可能感兴趣的:(框架,xml,技术,串行,类同)