亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

.net精簡框架集多個類同時串行化(XML方式)技術

系統 2149 0

存取類實例的參數最佳的方法當然是串行化技術,串行化支持兩種方式:二進制方式,可以高保真的保存類示例,另一種是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();

這是運行后的結果:

.net精簡框架集多個類同時串行化(XML方式)技術

相關代碼: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精簡框架集多個類同時串行化(XML方式)技術


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品婷婷久青青原 | 国产最新精品 | 91成人免费观看在线观看 | 欧美特级毛片aaaa | 国产亚洲一级精品久久 | 青青草这里只有精品 | 亚洲天堂久久精品 | 337p日本欧洲亚洲大胆艺术 | 国产区精品福利在线观看精品 | 综合视频网 | 99热1| 免费视频精品一区二区 | 四虎影永久在线高清免费 | 久久天天丁香婷婷中文字幕 | 91热爆在线 | 亚洲酒色1314狠狠做 | 欧美日韩无线码在线观看 | 四虎4hu永久免费视频大全 | 欧美成人自拍 | 国产91在线播放边 | 亚洲精品啪啪一区二区三区 | 国产精品成人免费视频不卡 | 国产综合在线播放 | 91精品国产综合成人 | 国产三级久久久精品麻豆三级 | 欧美日韩亚洲精品一区二区 | 国内精品久久久久久久aa护士 | 在线观看中文字幕国产 | 色国产在线| 黄色毛片免费观看 | 成人免费观看高清在线毛片 | 亚洲免费观看视频 | 综合伊人久久 | 欧美大尺度免费一级特黄 | 亚洲图片国产日韩欧美 | 日本在线 | 中文 | 欧美理论在线观看 | 免费黄色福利视频 | 国产精品99久久 | 亚洲一本通 | 99自拍视频在线观看 |