【TeeChart .NET教程】(十九):自定义序列化
【下载TeeChart.Net最新版本】
注意
自定义序列化是一个高级主题,它提供了正确保存和恢复开发人员设计的自定义元素的选项,这些自定义元素可能与TeeChart自己的功能集相关但不在其中,Steema将自定义序列化所能提供的支持限制在本教程中概述的技术范围内。
(一)介绍
1.1 自动序列化
TeeChart自动处理所有必要的序列化步骤,以允许保存和调用TeeChart。这包括图表及其系列的所有修改元素。
1.2 自定义序列化(自定义元素的序列化)
TeeChart系列提供用户需要的大部分功能,但用户希望对其进行修改以包含自己的其他信息,以便系列发布或采取行动或在使用该系列时提供应用程序其他部分的参考。为此,可能希望创建自己的SeriesType,从TeeChart系列派生,添加自己的自定义元素。TeeChart的自定义序列化允许保存(序列化)和恢复这些元素。
请注意:保存自定义元素分为两种技术:
- 已知类型的序列化(例如,字符串,整数,双精度)
- 自定义(未知)类型的序列化
(三)序列化自定义系列
3.1 已知类型的序列化(例如,string,int,double)定义自定义系列
假设用户希望从TeeChart的系列中获得系列,线系列包含需要的功能,但希望添加一些元素用于跟踪目的或作为与任何特定数据集关联的增值对象,以下是如何定义派生自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 保存并导出
您可以填充自定义变量并保存图表,并在重新导入已保存的图表时导入它们,只要变量属于已知的系统类型(例如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"); }
导入带有修改系列的图表
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将显示保存图表之前设置的值。
(四)自定义(未知)类型的序列化
4.1 使用自定义对象定义自定义系列
使用自定义对象的元素创建自定义系列的步骤与具有已知类型元素的系列的步骤类似,以下是从Line Series派生的Series的示例,其中包括已知和未知类型的新元素(MyObj),由于TeeChart不知道如何序列化和反序列化未知类型,我们需要提供一种机制,您可以编写例程来执行此操作并在序列化/反序列化时调用它。通过从Steema.TeeChart.Export.TemplateExport.ICustomSerialization接口继承该类来提供该机制,这要求您向类添加2个方法:
- 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; } } }
请注意,序列化使用'info.AddValue'来保存自定义元素的值,反序列化根据要保存的变量的类型使用“info.Getxxxx”。
4.2 保存并导入
一旦填充了自定义类中的例程以序列化和反序列化自定义元素,就可以像调用未修改的图表一样调用图表保存和加载,如前所示,例如:保存带有修改系列的图表
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"); }
导入带有修改系列的图表
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将显示保存图表之前设置的值。
(五)序列化自定义图表
序列化自定义图表所需的步骤与应用于自定义系列的步骤略有不同,从Steema.TeeChart.Chart中导出自定义图表,将其标记为Serializable并将其设置为ICustomSerialization类(请参阅下面的示例),已知类型将序列化,无需您执行上述系列示例中的任何必需步骤,对于未知类型的示例,我们将使用与Series示例MyObj中相同的对象。例如:包含已知和未知类型的自定义变量的示例图表
[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")); } }
保存图表时会自动处理序列化,例如: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"); }
反序列化需要一个额外的步骤,TeeChart的反序列化器将MyChart类型绑定到序列化图表,而不是图表,因为它是默认类型,请注意设置活页夹的行:
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"); }