`
mmdev
  • 浏览: 12920644 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

存取类实例的参数最佳的方法当然是串行化技术,串行化支持两种方式:二进制方式,可以高保真的保存类示例,另一种是XML方式,它仅保存公共数据。很可惜.net 2.0的精简框架集仅支持XML方式。

我这里做了一个示例,实现的功能是在PC机上可以画很多图形,用串行化方式保存相关信息,把相关信息下载到wince中,由wince中的c#程序读取串行化信息,并把相关类的实例信息还原出来。

这里面有个关键,图形类有可能有多个(示例为2个),而目前我查相关资料,都是一个类的串行化存取,并且如果你存两个以上的类,用XML是可以存取成功的,但是读取的时候它会告诉你失败。所以这里引入了ArrayList类的相关概念。

也就是说,我定义了一个类,类中的一个属性为ArrayList类的实例,这样用ArrayList实例我可以存储很多的类信息。

同样,不作任何处理用一般方法存储是成功的,但是在读取时,你发现ArrayList实例中的数据,都是object类型,原类型信息丢失!

这怎么办?继续查资料,发现有两种方法可以解决这个问题。

1、 [XmlElement(Type = typeof(YFRect)), XmlElement(Type = typeof(YFCircle))]
public ArrayList gData = new ArrayList(); //图元数据

在类中添加XmlElement声明,把ArrayList 类实例中有可能添加的类都标示出。

2、在存取数据时,用代码告诉XML串行化相关类的类型

Type[] gt = new Type[2]; //图元类型数组
gt[0] = typeof(YFRect);
gt[1] = typeof(YFCircle);

Stream sf = new FileStream(strXmlFile, FileMode.Open, FileAccess.Read, FileShare.None);
XmlSerializer xmls = new XmlSerializer(typeof(YFGraphicsData), gt);
XmlData = (YFGraphicsData)xmls.Deserialize(sf);
sf.Close();

这是运行后的结果:

相关代码:clsGraphics.cs (图元类)

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Drawing;
using System.Xml.Serialization;
using System.IO;
using System.Xml;

namespace YFXMLSaveLoad
{
//图元数据类
public class YFGraphicsData
{
//[XmlElement(Type = typeof(YFRect)), XmlElement(Type = typeof(YFCircle))]
//当代码传入类型数组时,则不需要上面的声明
public string strName = "测试";
public string strVer = "V1.0.0";
public ArrayList gData = new ArrayList(); //图元数据

}

//串行化操作类
public class YFXMLSerialize
{
//串行化
public void XMLSerializer(YFGraphicsData XmlData,string strXmlFile)
{
Type[] gt = new Type[2]; //图元类型数组
gt[0] = typeof(YFRect);
gt[1] = typeof(YFCircle);

Stream sf = new FileStream(strXmlFile, FileMode.Create, FileAccess.Write, FileShare.None);
XmlSerializer xmls = new XmlSerializer(typeof(YFGraphicsData), gt);
xmls.Serialize(sf, XmlData);
sf.Close();
}

//反串行化
public void XMLDeserialize(out YFGraphicsData XmlData, string strXmlFile)
{
Type[] gt = new Type[2]; //图元类型数组
gt[0] = typeof(YFRect);
gt[1] = typeof(YFCircle);

Stream sf = new FileStream(strXmlFile, FileMode.Open, FileAccess.Read, FileShare.None);
XmlSerializer xmls = new XmlSerializer(typeof(YFGraphicsData), gt);
XmlData = (YFGraphicsData)xmls.Deserialize(sf);
sf.Close();
}

}

//------------------------------------------------
public class YFGraphicsBase
{
public int width = 1;
//Color类不支持XML串行化
public int color = 0;
public virtual void Draw(Graphics e) { }
}

public class YFRect : YFGraphicsBase
{
public Rectangle xy;
public override void Draw(Graphics e)
{
e.DrawRectangle(new Pen(Color.FromArgb(color), width), xy);
}
}

public class YFCircle : YFGraphicsBase
{
public Rectangle xy;
public override void Draw(Graphics e)
{
e.DrawEllipse(new Pen(Color.FromArgb(color), width), xy);
}
}

}

Form1.cs 窗体代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Xml.Serialization;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;

namespace YFXMLSaveLoad
{
public partial class Form1 : Form
{

YFGraphicsData XmlData = new YFGraphicsData(); //图元数据
YFXMLSerialize XmlWork = new YFXMLSerialize(); //XML串行化方法

public Form1()
{
InitializeComponent();
panel1.Refresh();
}

//自绘
private void button4_Click(object sender, EventArgs e)
{
YFRect yfr001=new YFRect();
YFRect yfr002 = new YFRect();
YFCircle yfc001 = new YFCircle();

yfr001.color = Color.Blue.ToArgb();
yfr001.xy.X = 10;
yfr001.xy.Y = 10;
yfr001.xy.Width = 50;
yfr001.xy.Height = 50;

yfr002.color = Color.FromArgb(0, 0, 0).ToArgb();
yfr002.width = 2;
yfr002.xy.X = 30;
yfr002.xy.Y = 50;
yfr002.xy.Width = 100;
yfr002.xy.Height = 80;

yfc001.color = Color.Red.ToArgb();
yfc001.xy.X = 20;
yfc001.xy.Y = 20;
yfc001.xy.Width = 80;
yfc001.xy.Height = 90;

XmlData.gData.Clear();
XmlData.gData.Add(yfr001);
XmlData.gData.Add(yfc001);
XmlData.gData.Add(yfr002);

panel1.Refresh();

}

//绘图
private void panel1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.Clear(Color.PapayaWhip);
foreach (YFGraphicsBase dw in XmlData.gData)
{
dw.Draw(e.Graphics);
}
textBox1.Text = XmlData.gData.Count.ToString();
}

//清图元
private void button3_Click(object sender, EventArgs e)
{
XmlData.gData.Clear();
panel1.Refresh();
}

//保存图元
private void button2_Click(object sender, EventArgs e)
{
//图元串行化
XmlWork.XMLSerializer(XmlData,"TuData.xml");
//------
MessageBox.Show("OK");
}

//调入图元
private void button1_Click(object sender, EventArgs e)
{
//图元反串行化
XmlWork.XMLDeserialize(out XmlData, "TuData.xml");
//------
panel1.Refresh();
}

}
}

//-----------------------------------

分享到:
评论

相关推荐

    .net精简框架程序设计(VB.NET)

    .net精简框架程序设计(VB.NET)附带的源代码

    NET精简框架程序设计:C#版

    本书是一部关于.NET精简框架程序的理论专著,全书涵盖了.NET精简框架开发的方方面面,如语言基础、用户界面、数据管理、创建图形输出。书中详细地描述了编程的具体方法,使没有.NET精简框架开发经验甚至Windows开发...

    <.net 精简框架程序设计>

    包含c#、vb.net 两版本的源代码 以及一个工具包 PInvokeWizard

    .net2.0精简版虚拟机(脱离.NET框架运行.NET程序)

    .net2.0精简版虚拟机(脱离.NET框架运行.NET程序),再没有安装.NET Framework2.0的机器上运行.NET2.0程序!精简后的.NET通用模块只有9M,SOFT文件夹下是测试程序! 本程序没有版本信息,给大家免费使用

    VB.NET2008速成精简版

    VB.NET 2008 速成精简版,自己把运行库和.NET FRAMEWORK安装好之后,就可以安装这个了。

    用.NET精简版2.0和SQL Server 2005打造强力智能客户端

    库类支持序列化/反序列化 XmlSerializer 引擎 Serialize 方法将类转化为 XML Deserialize 重建类实例 序列化控制 类必须具有缺省构造函数 Attributes 控制细节 XmlElement XmlAttribute 以上都是我从课件...

    FCKEditor Asp.net精简版

    FCKEditor Asp.net的精简后版本。

    vb 2005 精简版

    vb.net 2005 精简安装版。 vb.net 2005 精简安装版 vb.net 2005 精简安装版 vb.net 2005 精简安装版

    微软.net精简框架最常见问题及回答.doc

    wince常见问题与回复,很不错的文档。

    VS.NET和.NET Framework 精简版入门

    VS.NET和.NET Framework 精简版入门

    asp.net mvc 换肤框架

    代码经过精简,使用起来很简单: protected void Application_Start(object sender, EventArgs e) { InitRouting(RouteTable.Routes); // 使用自定义的皮肤视图引擎 SkinViewEngine // 对应的视图文件夹为:/...

    ASP.NET Ajax框架教程.doc

    微软的ASP.NET Ajax框架 此教程主要针对开发应用场景和功能点进行展开示例,包括26个精简的小例子,在实际开发中也可以作为查找手册使用。

    ADO.NET精简教程(快速入门)

    本资源主要简介ADO精简入门类及其用法,希望对初学者有帮助!

    风越.Net代码生成器 [FireCode Creator] V1.3 精简版

    默认提供asp、aspx两种代码框架及多个界面设计模板,均可任意修改管理。通过自定义生成程序的界面风格与输出代码,用户可将其扩展为ASPX/ASP/PHP/JSP等各种程序的代码生成器。内置的.net代码框架,能建立C#语言的...

    c# .net core 3.1 好用的通用后台管理 前后端分离框架

    前后端分离框架,基于.NET5/.NET6实现的通用权限管理平台。整合最新技术高效快速开发,前后端分离模式,开箱即用。 代码量少、学习简单、通俗易懂、功能强大、易扩展、轻量级,让web开发更快速、简单高效(从此告别...

    C#.Net2.0解析Json,精简版的Newtonsoft.Json.dll,JsonReader,JsonSerializer(Json.Net)

    仅保留了读取和解析json数据的相关类和方法(JsonReader,JsonSerializer),去除了写入json数据以及json和xml互相转换的部分以及其他不常用的类。 编译后dll仅20kb 也可以直接将类添加到项目中使用,非常方便 再次声明...

    .NET公共类库(.NET 2.0)

    序列化功能辅助类 Session封装 Smtp邮件辅助类 字符串实用类 类型转换类 用户实用类 验证码类 验证实用类 XML处理基类 数据出库处理类 常用类方法 网页界面功能类 UBB代码辅助类 客户端代码功能类 客户端代码精简类 ...

    .net 4.5 Perst4.NET

    Perst可以运行在Java SE、EE及ME下,同时也能运行在.NET下,包括.NET精简版框架。其他特性列举如下: ● 垃圾收集 ● 对挂起的引用的探测 ● 自动的schema更新(evolution) ●XML的导入/导出功能 ● 支持主-从复制 ...

    ASP.NET源码包合集9.zip

    [电子商务]peny Olympic Games 精简购物网站系统_penyolympicgames.rar [电子商务]QICMS商家联盟网站系统 v1.0 091006 ACCESS版_qicms_dazhe_access.rar [电子商务]SHOPD金牌网店系统源码_shopds.rar [电子商务]...

Global site tag (gtag.js) - Google Analytics