.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.  

 


















本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/323794,如需转载请自行联系原作者

相关文章
|
15天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
2月前
|
开发框架 JavaScript 前端开发
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
|
1月前
|
开发框架 网络协议 .NET
深入.net框架
深入.net框架
11 0
|
1月前
|
数据库
最全三大框架整合(使用映射)——struts.xml和web.xml配置
最全三大框架整合(使用映射)——数据库资源文件jdbc.properties
10 0
|
1月前
最全三大框架整合(使用映射)——applicationContext.xml里面的配置
最全三大框架整合(使用映射)——applicationContext.xml里面的配置
7 0
|
1月前
|
XML 开发框架 .NET
C# .NET面试系列八:ADO.NET、XML、HTTP、AJAX、WebService
## 第二部分:ADO.NET、XML、HTTP、AJAX、WebService #### 1. .NET 和 C# 有什么区别? .NET(通用语言运行时): ```c# 定义:.NET 是一个软件开发框架,提供了一个通用的运行时环境,用于在不同的编程语言中执行代码。 作用:它为多语言支持提供了一个统一的平台,允许不同的语言共享类库和其他资源。.NET 包括 Common Language Runtime (CLR)、基础类库(BCL)和其他工具。 ``` C#(C Sharp): ```c# 定义: C# 是一种由微软设计的面向对象的编程语言,专门为.NET 平台开发而创建。 作
174 2
|
1月前
|
XML 存储 BI
如何把一个 ABAP 类的实例,序列化成 XML 字符串试读版
如何把一个 ABAP 类的实例,序列化成 XML 字符串试读版
13 0
|
2月前
|
算法 BI API
C#/.NET/.NET Core优秀项目和框架2024年1月简报
C#/.NET/.NET Core优秀项目和框架2024年1月简报
|
3月前
|
PHP Windows
php扩展com_dndnet(PHP与.NET框架进行交互)
php扩展com_dndnet(PHP与.NET框架进行交互)
php扩展com_dndnet(PHP与.NET框架进行交互)
|
3月前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
25 0