.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();
- }
- }
- }
- //-----------------------------------
本文轉自yefanqiu51CTO部落格,原文連結:http://blog.51cto.com/yfsoft/323794,如需轉載請自行聯絡原作者
相關文章
- 解析.Net框架下的XML程式設計技術框架XML程式設計
- XML專題文章收集整理 解析.Net框架下的XML程式設計技術XML框架程式設計
- Python技術分享:如何同時檢測多個人臉?Python
- .net中物件序列化技術淺談物件
- .NET物件的XML序列化和反序列化物件XML
- 最精簡的自定義.net 開發框架框架
- 實體類與XML序列化與反序列化XML
- Microsoft .NET Remoting 框架技術ROSREM框架
- python 同時迭代多個序列Python
- 使用 XML 時儘量避免使用的技術XML
- wriesharek同時監聽多個埠
- MyEclipse同時配置多個tomcatEclipseTomcat
- [.net 物件導向程式設計進階] (11) 序列化(Serialization)(三) 通過介面 IXmlSerializable 實現XML序列化 及 通用XML類物件程式設計XML
- XML解析技術XML
- 關於XML序列化的簡單例子XML單例
- MySQL PXC叢集多個節點同時大量併發update同一行MySql
- fork同時建立多個子程式的方法
- 同時多個SQL命令執行的方法SQL
- 用.NET框架實現序列化框架
- 一個只有十行的精簡MVVM框架MVVM框架
- MessagePack 序列化框架在netty中的簡單實現。框架Netty
- android同時使用多個library時的問題Android
- 分享一個 asp.net core 多檔案分塊同時上傳的元件ASP.NET元件
- 知物由學 | 全新文字實時聚類技術,一網打盡同類有害內容聚類
- 同時渲染兩個世界:恐怖遊戲《靈媒》背後的尖端技術遊戲
- golang 利用 WaitGroup 控制多個 goroutine 同時完成GolangAI
- JavaScript 同時宣告多個變數並賦值JavaScript變數賦值
- 使用PowerBuilder同時訪問多個資料庫UI資料庫
- python同時給多個變數賦值Python變數賦值
- 同時最小化多個Windows視窗(轉)Windows
- Windows環境同時啟動多個TomcatWindowsTomcat
- 讓每個企業用最簡單的方式享受IT技術的便利
- 技術分享 | kubernetes pod 簡介
- 技術問答集錦(11)JVM類載入JVM
- JAVA 兩個類同時實現同一個介面的方法Java
- create-react-app同時對多個框架(antd+antd-mobile)做按需載入的方法ReactAPP框架
- 多程序協同的實時資料採集與共享系統
- js replace替換字串,同時替換多個方法JS字串