.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天前
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
|
15天前
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
|
15天前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
|
1月前
|
消息中间件 开发框架 监控
NET任务调度框架Hangfire使用指南
Hangfire 是一个用于 .NET 应用程序的开源任务调度框架,支持长时间运行任务、定时任务等。通过简单的安装配置,即可将任务从主线程分离,提升应用性能。支持多种数据库,提供丰富的任务类型如立即执行、延迟执行和周期性任务,并有可视化管理界面 Hangfire Dashboard。还支持安全性配置及扩展插件,如 Hangfire.HttpJob,适合各种复杂场景下的任务调度需求。
60 1
NET任务调度框架Hangfire使用指南
|
2月前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
49 4
|
2月前
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
46 3
|
2月前
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
44 3
|
2月前
|
开发框架 安全 Java
.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力
本文深入探讨了.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力。.NET不仅支持跨平台开发,具备出色的安全性和稳定性,还能与多种技术无缝集成,为企业级应用提供全面支持。
40 3
|
3月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
95 1
|
5月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)