图表序列化(图表控件)

序列化是将图表转换成可以保存或传输的格式的过程。通常用于保存图表属性,但是也可以用于检索数据并将数据加载到现有图表控件中。

在序列化图表数据时,图表仅序列化具有非默认值的属性。

序列化数据格式

可以将数据序列化为 XML 或二进制文件。在使用派生自 StringReaderStringWriter、XMLReader 或 XMLWriter 的对象保存或加载数据时,必须使用 XML 数据格式。

数据的默认格式为 XML。若要以二进制格式保存和加载数据,请将 Format 属性设置为 SerializationFormat.Binary

保存和加载数据

若要保存图表数据,请使用 Chart.Serializer 对象中的 Save 方法。若要将序列化数据加载到图表控件中,请使用 Load 方法。

默认情况下,Chart.Serializer 对象会保存和加载图表的所有属性。SaveLoad 方法都可重载,因此这两个方法可用于很多其他对象。

下面的代码演示如何保存或加载图表的数据。

' Save to and load from an XML file
Chart1.Serializer.Save("SavedData.xml")
Chart1.Serializer.Load("SavedData.xml")

' Save to and load from a .NET Stream object.
Dim myStream As New System.IO.MemoryStream()
Chart1.Serializer.Save(myStream)
Chart1.Serializer.Load(myStream)
//Save to and load from an XML file
Chart1.Serializer.Save("SavedData.xml");
Chart1.Serializer.Load("SavedData.xml");

// Save to and load from a .NET Stream object.
System.IO.MemoryStream myStream = new System.IO.MemoryStream();
Chart1.Serializer.Save(myStream);
Chart1.Serializer.Load(myStream);

下面的代码演示如何使用派生自 XMLReader 和 XMLWriter 的对象加载和保存图表数据。

Dim myWriter As New System.XML.XmlTextWriter("c:\MyPersistedData.xml", System.Text.Encoding.ASCII)
Chart1.Serializer.Save(myWriter)

' We initialize the XML reader with data from a file.
Dim myXMLReader As New System.XML.XmlTextReader("c:\MyPersistedData.xml")
Chart1.Serializer.Load(myXMLReader)
System.XML.XmlTextWriter myWriter = new System.XML.XmlTextWriter("c:\\MyPersistedData.xml", System.Text.Encoding.ASCII);
Chart1.Serializer.Save(myWriter);

// We initialize the XML reader with data from a file.
System.XML.XmlTextReader myXMLReader = new System.XML.XmlTextReader("c:\\MyPersistedData.xml");
Chart1.Serializer.Load(myXMLReader);

序列化状态数据 (ASP.NET)

如果要将 ViewStateData 属性用于状态管理,也可以使用 Serializer 对象的 LoadSave 方法保存和加载用户定义的视图状态。必须使用 StringReader 将数据读入控件,并使用 StringWriter 将可序列化的数据写入 ViewStateData 属性。

下面的代码演示如何使用 StringReaderStringWriter 保存和加载序列化数据。

Dim sw As New System.IO.StringWriter
Chart1.Serializer.Save(sw)

' Initialize the string reader with the data being posted by the client back to the server.
Dim sr As New StringReader(Chart1.ViewStateData)
Chart1.Serializer.Load(sr)
System.IO.StringWriter sw = new System.IO.StringWriter();
Chart1.Serializer.Save(sw);

// Initialize the string reader with the data being posted by the client back to the server.
StringReader sr = new StringReader(Chart1.ViewStateData);
Chart1.Serializer.Load(sr);

指定要序列化的图表属性

若要指定要序列化的属性,请使用 Chart.Serializer 中的 Content 和/或 SerializableContent 属性。

Content 属性指定要序列化的图表属性的类别,而 SerializableContent 属性是要序列化的所有图表属性的逗号分隔列表。这些属性适用于所有加载、保存和重置操作。

重要说明重要提示

Content 属性通过插入属性通配符,在内部使用 SerializableContent。若要同时使用这两个属性,请确保将 SerializableContent 字符串与其自己连接,以在 Content 属性中保存您的设置。

若要指定不序列化的属性,请使用 NonSerializableContent 属性(方式与 SerializableContent 属性相同)。

有时可以将某个属性同时设置为进行序列化和不进行序列化。在这种情况下,序列化过程会按照以下方式解决不一致的问题:

  • 命名属性优先于属性通配符。例如,如果 SerializableContent 设置为“*.BackColor”,而 NonSerializableContent 设置为“ChartArea.BackColor”,则所有 BackColor 属性(除了 ChartArea 对象)都将序列化。

  • 其他情况下,SerializableContent 优先于 NonSerializableContent

下面的代码演示如何将图表的外观数据和轴标签序列化到磁盘,然后加载这些序列化数据。

' Save chart appearance properties that have non-default values, as well as axis labels.
Chart1.Serializer.Content = SerializationContent.Appearance
' Concatenate the Content property string and the SerializableContent string
Chart1.Serializer.SerializableContent += ",DataPoint.AxisLabel,Series.AxisLabels,Series.Name,ChartArea.Name"
' Exclude all chart BackColor properties
Chart1.Serializer.NonSerializableContent = *.BackColor"
' Save the chart data
Chart1.Serializer.Save("AppearanceProps.xml")

' Load the serialized data.
Chart1.Serializer.Content = SerializationContent.Appearance
Chart1.Serializer.SerializableContent += ",DataPoint.AxisLabel,Series.AxisLabels,Series.Name,ChartArea.Name"
Chart1.Serializer.Load("AppearanceProps.xml")
// Save chart appearance properties that have non-default values, as well as axis labels.
Chart1.Serializer.Content = SerializationContent.Appearance;
// Concatenate the Content property string and the SerializableContent string
Chart1.Serializer.SerializableContent += ",DataPoint.AxisLabel,Series.AxisLabels,Series.Name,ChartArea.Name";
// Exclude all chart BackColor properties
Chart1.Serializer.NonSerializableContent = *.BackColor";
// Save the chart data
Chart1.Serializer.Save("AppearanceProps.xml");

// Load the serialized data.
Chart1.Serializer.Content = SerializationContent.Appearance;
Chart1.Serializer.SerializableContent += ",DataPoint.AxisLabel,Series.AxisLabels,Series.Name,ChartArea.Name";
Chart1.Serializer.Load("AppearanceProps.xml");

将图表属性重置为默认值

在任何时候,若要重置图表的所有属性,请使用 Reset 方法。

默认情况下,序列化 Load 方法将未以序列化方式保存的所有属性(包括未序列化的可序列化属性)重置为其默认值。如果使用 Save 方法,然后立即使用 Load 方法,则可能导致丢失数据。若要更改此行为,请将 ResetWhenLoading 属性设置为 False,使 Load 方法不重置具有非默认值的任何属性。

重要说明重要提示

在重新加载集合属性时必须小心谨慎。如果保持 Chart.SeriesChart.ChartAreas 中的特定项,并且 ResetWhenLoading 设置为 True,则在保存后立即重新加载图表会导致从图表中删除所有序列或图表区域项。

请参阅

参考

System.Windows.Forms.DataVisualization.Charting

System.Web.UI.DataVisualization.Charting

其他资源

使用图表控件