【TeeChart .NET教程】(十九):自定義序列化
【下載TeeChart.Net最新版本】
注意
自定義序列化是一個(gè)高級(jí)主題,它提供了正確保存和恢復(fù)開(kāi)發(fā)人員設(shè)計(jì)的自定義元素的選項(xiàng),這些自定義元素可能與TeeChart自己的功能集相關(guān)但不在其中,Steema將自定義序列化所能提供的支持限制在本教程中概述的技術(shù)范圍內(nèi)。
(一)介紹
1.1 自動(dòng)序列化
TeeChart自動(dòng)處理所有必要的序列化步驟,以允許保存和調(diào)用TeeChart。這包括圖表及其系列的所有修改元素。
1.2 自定義序列化(自定義元素的序列化)
TeeChart系列提供用戶需要的大部分功能,但用戶希望對(duì)其進(jìn)行修改以包含自己的其他信息,以便系列發(fā)布或采取行動(dòng)或在使用該系列時(shí)提供應(yīng)用程序其他部分的參考。為此,可能希望創(chuàng)建自己的SeriesType,從TeeChart系列派生,添加自己的自定義元素。TeeChart的自定義序列化允許保存(序列化)和恢復(fù)這些元素。
請(qǐng)注意:保存自定義元素分為兩種技術(shù):
- 已知類型的序列化(例如,字符串,整數(shù),雙精度)
- 自定義(未知)類型的序列化
(三)序列化自定義系列
3.1 已知類型的序列化(例如,string,int,double)定義自定義系列
假設(shè)用戶希望從TeeChart的系列中獲得系列,線系列包含需要的功能,但希望添加一些元素用于跟蹤目的或作為與任何特定數(shù)據(jù)集關(guān)聯(lián)的增值對(duì)象,以下是如何定義派生自Line Series的Custom Series的示例:
public class MyLine : Steema.TeeChart.Styles.Line { public MyLine(Chart c) : base(c) { myStrVar = "default"; } public MyLine() : this((Chart)null) { } private string myStrVar = ""; private int myIntVar = 0; public string MyStrProp { get { return myStrVar; } set { myStrVar = value; } } public int MyIntProp { get { return myIntVar; } set { myIntVar = value; } } }
3.2 保存并導(dǎo)出
您可以填充自定義變量并保存圖表,并在重新導(dǎo)入已保存的圖表時(shí)導(dǎo)入它們,只要變量屬于已知的系統(tǒng)類型(例如String,Integer,Double),就不需要額外的步驟。TeeChart將處理序列化和反序列化,例如:保存帶有修改系列的圖表
private void button1_Click(object sender, EventArgs e) { MyLine mLine=new MyLine(); mLine.MyStrProp = "now set"; mLine.MyIntProp = 43; tChart1.Series.Add(mLine); mLine.FillSampleValues(); tChart1.Export.Template.Save(@"c:\files\customLine.ten"); }
導(dǎo)入帶有修改系列的圖表
private void button1_Click(object sender, EventArgs e) private void button2_Click(object sender, EventArgs e) { tChart1.Clear(); tChart1.Import.Template.Load(@"c:\files\customLine.ten"); label1.Text = ((MyLine)(tChart1[0])).MyStrProp; label2.Text = ((MyLine)(tChart1[0])).MyIntProp.ToString(); }
Label1和Label2將顯示保存圖表之前設(shè)置的值。
(四)自定義(未知)類型的序列化
4.1 使用自定義對(duì)象定義自定義系列
使用自定義對(duì)象的元素創(chuàng)建自定義系列的步驟與具有已知類型元素的系列的步驟類似,以下是從Line Series派生的Series的示例,其中包括已知和未知類型的新元素(MyObj),由于TeeChart不知道如何序列化和反序列化未知類型,我們需要提供一種機(jī)制,您可以編寫(xiě)例程來(lái)執(zhí)行此操作并在序列化/反序列化時(shí)調(diào)用它。通過(guò)從Steema.TeeChart.Export.TemplateExport.ICustomSerialization接口繼承該類來(lái)提供該機(jī)制,這要求您向類添加2個(gè)方法:
- public void Serialize(SerializationInfo info)
- public void DeSerialize(SerializationInfo info)
using Steema.TeeChart.Export; // Custom Line class public class MyLine : Steema.TeeChart.Styles.Line, TemplateExport.ICustomSerialization { public MyLine(Chart c) : base(c) { myStrVar = "default"; } public MyLine() : this((Chart)null) { } private string myStrVar = ""; private int myIntVar = 0; private MyObj myMyObj; public string MyStrProp { get { return myStrVar; } set { myStrVar = value; } } public int MyIntProp { get { return myIntVar; } set { myIntVar = value; } } /// <summary> /// Method to ease population of the myMyObj variable. /// </summary> public void setMyObj(int i, string s) { myMyObj = new MyObj(i, s); } /// <summary> /// Property of Custom type, MyObj /// </summary> public MyObj MyObj { get { return myMyObj; } set { myMyObj = value; } } /// <summary> /// Obligatory method (TemplateExport.ICustomSerialization interface) /// </summary> public void Serialize(SerializationInfo info) { //save custom elements info.AddValue("myObjStr", myMyObj.MyString, myMyObj.MyString.GetType()); info.AddValue("myObjInt", myMyObj.MyInt); } /// <summary> /// Obligatory method (TemplateExport.ICustomSerialization interface) /// </summary> public void DeSerialize(SerializationInfo info) { //recover custom elements into the myMyObj variable myMyObj = new MyObj(info.GetInt32("myObjInt"), info.GetString("myObjStr")); } } //custom object public class MyObj { private string myString; private int myInt; public MyObj(int i, string s) { myString = s; myInt = i; } public int MyInt { get { return myInt; } set { myInt = value; } } public string MyString { get { return myString; } set { myString = value; } } }
請(qǐng)注意,序列化使用'info.AddValue'來(lái)保存自定義元素的值,反序列化根據(jù)要保存的變量的類型使用“info.Getxxxx”。
4.2 保存并導(dǎo)入
一旦填充了自定義類中的例程以序列化和反序列化自定義元素,就可以像調(diào)用未修改的圖表一樣調(diào)用圖表保存和加載,如前所示,例如:保存帶有修改系列的圖表
private void button1_Click(object sender, EventArgs e) { MyLine mLine=new MyLine(); mLine.MyStrProp = "now set"; mLine.MyIntProp = 43; mLine.setMyObj(43, "set val 43"); tChart1.Series.Add(mLine); mLine.FillSampleValues(); tChart1.Export.Template.Save(@"c:\files\customLine.ten"); }
導(dǎo)入帶有修改系列的圖表
private void button2_Click(object sender, EventArgs e) { tChart1.Clear(); tChart1.Import.Template.Load(@"c:\files\customLine.ten"); label1.Text = ((MyLine)(tChart1[0])).MyStrProp; label2.Text = ((MyLine)(tChart1[0])).MyIntProp.ToString(); label3.Text = ((MyLine)(tChart1[0])).MyObj.MyInt.ToString(); label4.Text = ((MyLine)(tChart1[0])).MyObj.MyString; }
Label1,Label2,Label3和Label4將顯示保存圖表之前設(shè)置的值。
(五)序列化自定義圖表
序列化自定義圖表所需的步驟與應(yīng)用于自定義系列的步驟略有不同,從Steema.TeeChart.Chart中導(dǎo)出自定義圖表,將其標(biāo)記為Serializable并將其設(shè)置為ICustomSerialization類(請(qǐng)參閱下面的示例),已知類型將序列化,無(wú)需您執(zhí)行上述系列示例中的任何必需步驟,對(duì)于未知類型的示例,我們將使用與Series示例MyObj中相同的對(duì)象。例如:包含已知和未知類型的自定義變量的示例圖表
[System.Serializable()] public class MyChart : Steema.TeeChart.Chart, TemplateExport.ICustomSerialization { private MyObj myMyObj; public MyChart() : base() { } //required constructor protected MyChart(SerializationInfo info, StreamingContext context) : base(info, context) { } private string myStrVar = ""; private int myIntVar = 0; public string MyStrProp { get { return myStrVar; } set { myStrVar = value; } } public int MyIntProp { get { return myIntVar; } set { myIntVar = value; } } public void setMyObj(int i, string s) { myMyObj = new MyObj(i, s); } public MyObj MyObj { get { return myMyObj; } set { myMyObj = value; } } //required method public void Serialize(SerializationInfo info) { object o = myMyObj.MyString; info.AddValue("myObjStr", o, o.GetType()); info.AddValue("myObjInt", myMyObj.MyInt); } //required method public void DeSerialize(SerializationInfo info) { myMyObj = new MyObj(info.GetInt32("myObjInt"), info.GetString("myObjStr")); } }
保存圖表時(shí)會(huì)自動(dòng)處理序列化,例如:Serialise
private void button1_Click(object sender, EventArgs e) { MyChart myChart = new MyChart(); myChart.Series.Add(new Steema.TeeChart.Styles.Bar()); myChart[0].FillSampleValues(); myChart.setMyObj(22, "set 22"); myChart.MyStrProp = "set String Prop"; myChart.Export.Template.IncludeData = true; myChart.Export.Template.Save(@"c:\files\customChart.ten"); }
反序列化需要一個(gè)額外的步驟,TeeChart的反序列化器將MyChart類型綁定到序列化圖表,而不是圖表,因?yàn)樗悄J(rèn)類型,請(qǐng)注意設(shè)置活頁(yè)夾的行:
myChart.Import.Template.CustomType = myChart.ToString();
例如:DeSerialise
private void button2_Click(object sender, EventArgs e) { MyChart myChart = new MyChart(); myChart.Import.Template.CustomType = myChart.ToString(); myChart = (MyChart)(myChart.Import.Template.Load(@"c:\files\customChart.ten")); myChart.Header.Text = myChart.MyObj.MyString; myChart.Footer.Text = myChart.MyStrProp; myChart.Footer.Visible = true; myChart.Export.Template.Save(@"c:\files\testCustomChartmodded.ten"); myChart.Export.Image.PNG.Save(@"c:\files\testCustomChart.png"); }