开发者社区> 技术小美> 正文

.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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
18052 0
动力节点王鹤|Spring Boot框架学习笔记(一)Xml 和 JavaConfig
Spring Boot框架 • 官方下载地址 动力节点spring资料 • 视频观看地址 https://www.bilibili.com/video/BV1XQ4y1m7ex 第一章 Xml 和 JavaConfig Spring 使用 Xml 作为容器配置文件, 在 3.0 以后加入了 JavaConfig. 使用 java 类做配 置文件使用。
24 0
Protocol Buffers,一款比xml快100倍的序列化框架!
Protocol Buffers,一款比xml快100倍的序列化框架!
19 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
23585 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
13663 0
手写类似dubbo的rpc框架第一章《自定义配置xml》
本案例通过三个章节来实现一共简单的rpc框架,用于深入学习rpc框架是如何通信的,当前章节主要介绍如何自定义xml文件并进行解析。想解析自定义的xml首先定义自己的xsd文件,并且实现spring的NamespaceHandlerSupport、BeanDefinitionParser,两个方法进行处理。
25 0
【AAAI oral】阿里北大提出新attention建模框架,一个模型预测多种行为
本文提出一种基于注意力机制的用户异构行为序列的建模框架,并将其应用到推荐场景中。作者提出用同一种模型同时预测多种类型的用户行为,由于没有使用RNN,CNN等方法,因此在提高效果的同时,该方法能够有更快的训练速度。
5158 0
+关注
6902
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载