1 //-------------------------------------------------------------
2 // <copyright company=
\92Microsoft Corporation
\92>
3 // Copyright © Microsoft Corporation. All Rights Reserved.
5 //-------------------------------------------------------------
6 // @owner=alexgor, deliant
7 //=================================================================
8 // File: ChartSerializer.cs
10 // Namespace: System.Web.UI.WebControls[Windows.Forms].Charting
12 // Classes: ChartSerializer
14 // Purpose: Serialization saves the state of the chart and also
15 // provides the ability to load the serialized data back
16 // into the chart. All chart properties can be persisted,
17 // including the chart's data.
19 // ChartSerializer class only provides serialization API
20 // for the user and actual serialization is performed by
21 // XmlFormatSerializer or BinaryFormatserializer classes
22 // depending on the Format property.
24 // Reviewed: AG - Jul 31, 2002
26 // AG - Microsoft 15, 2007
28 //===================================================================
30 #region Used namespaces
35 using System.Collections;
36 using System.ComponentModel;
37 using System.ComponentModel.Design;
40 using System.Windows.Forms.DataVisualization.Charting.Data;
41 using System.Windows.Forms.DataVisualization.Charting.ChartTypes;
42 using System.Windows.Forms.DataVisualization.Charting.Utilities;
43 using System.Windows.Forms.DataVisualization.Charting;
45 using System.Web.UI.DataVisualization.Charting;
46 using System.Web.UI.DataVisualization.Charting.Utilities;
53 namespace System.Windows.Forms.DataVisualization.Charting
55 namespace System.Web.UI.DataVisualization.Charting
59 #region Serialization enumeration
62 /// An enumeration of the formats of the chart serializer.
64 public enum SerializationFormat
67 /// XML serializer format.
72 /// Binary serializer format.
79 /// An enumeration of chart serializable content definition flags
82 public enum SerializationContents
90 /// Serialize only series data.
95 /// Serialize chart visual appearance (e.g. Colors, Line Styles).
100 /// All content is serialized.
102 All = Default | Data | Appearance
109 /// ChartSerializer class provides chart serialization.
112 SRDescription("DescriptionAttributeChartSerializer_ChartSerializer"),
113 DefaultProperty("Format"),
116 [AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
117 [AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
119 public class ChartSerializer
121 #region Private fields
123 // Reference to the service container
124 private IServiceContainer _serviceContainer = null;
126 // Reference to the chart object
127 private Chart _chart = null;
129 // Reference to the serializer object
131 private SerializerBase _serializer = new XmlFormatSerializer();
133 // Format of the serializer in use
134 private SerializationFormat _format = SerializationFormat.Xml;
136 // Serialization content
137 private SerializationContents _content = SerializationContents .Default;
141 #region Constructors and Service Provider methods
144 /// Default constructor is unavailable
146 private ChartSerializer()
151 /// Internal constructor
153 /// <param name="container">Service container reference.</param>
154 internal ChartSerializer(IServiceContainer container)
156 if(container == null)
158 throw(new ArgumentNullException(SR.ExceptionInvalidServiceContainer));
160 _serviceContainer = container;
164 /// Returns ChartSerializer service object
166 /// <param name="serviceType">Requested service type.</param>
167 /// <returns>ChartSerializer service object.</returns>
168 internal object GetService(Type serviceType)
170 if(serviceType == typeof(ChartSerializer))
174 throw (new ArgumentException( SR.ExceptionChartSerializerUnsupportedType( serviceType.ToString())));
179 #region Public properties
182 /// Gets or sets the serializable content.
185 SRCategory("CategoryAttributeMisc"),
186 DefaultValue(typeof(SerializationContents ), "Default"),
187 SRDescription("DescriptionAttributeChartSerializer_Content")
189 public SerializationContents Content
200 // Automatically set SerializableContent and NonSerializableContent properties
201 SetSerializableContent();
206 /// Gets or sets the format used to serialize the chart data.
209 SRCategory("CategoryAttributeMisc"),
210 DefaultValue(typeof(SerializationFormat), "Xml"),
211 SRDescription("DescriptionAttributeChartSerializer_Format")
213 public SerializationFormat Format
225 // Create new serializer object
226 SerializerBase newSerializer = null;
228 if(_format == SerializationFormat.Binary)
230 newSerializer = new BinaryFormatSerializer();
234 newSerializer = new XmlFormatSerializer();
236 // Copy serializer settings
237 newSerializer.IsUnknownAttributeIgnored = _serializer.IsUnknownAttributeIgnored;
238 newSerializer.NonSerializableContent = _serializer.NonSerializableContent;
239 newSerializer.IsResetWhenLoading = _serializer.IsResetWhenLoading;
240 newSerializer.SerializableContent = _serializer.SerializableContent;
241 _serializer = newSerializer;
247 /// Gets or sets a flag which indicates whether object properties are reset to default
248 /// values before loading.
251 SRCategory("CategoryAttributeMisc"),
253 SRDescription("DescriptionAttributeChartSerializer_ResetWhenLoading")
255 public bool IsResetWhenLoading
259 return _serializer.IsResetWhenLoading;
263 _serializer.IsResetWhenLoading = value;
270 /// Gets or sets a flag which indicates whether unknown XML properties and elements will be
271 /// ignored without throwing an exception.
274 SRCategory("CategoryAttributeMisc"),
276 SRDescription("DescriptionAttributeChartSerializer_IgnoreUnknownXmlAttributes")
278 public bool IsUnknownAttributeIgnored
282 return _serializer.IsUnknownAttributeIgnored;
286 _serializer.IsUnknownAttributeIgnored = value;
291 /// Gets or sets a flag which indicates whether chart
292 /// serializer is working in template creation mode.
295 SRCategory("CategoryAttributeMisc"),
297 SRDescription("DescriptionAttributeChartSerializer_TemplateMode")
299 public bool IsTemplateMode
303 return _serializer.IsTemplateMode;
307 _serializer.IsTemplateMode = value;
314 /// Gets or sets the chart properties that can be serialized.
315 /// Comma separated list of serializable (Save/Load/Reset) properties.
316 /// "ClassName.PropertyName,[ClassName.PropertyName]".
319 SRCategory("CategoryAttributeMisc"),
321 SRDescription("DescriptionAttributeChartSerializer_SerializableContent")
323 public string SerializableContent
327 return _serializer.SerializableContent;
331 _serializer.SerializableContent = value;
336 /// Gets or sets the chart properties that will not be serialized.
337 /// Comma separated list of non-serializable (Save/Load/Reset) properties.
338 /// "ClassName.PropertyName,[ClassName.PropertyName]".
341 SRCategory("CategoryAttributeMisc"),
343 SRDescription("DescriptionAttributeChartSerializer_NonSerializableContent")
345 public string NonSerializableContent
349 return _serializer.NonSerializableContent;
353 _serializer.NonSerializableContent = value;
359 #region Public methods
362 /// This method resets all properties of the chart to default values. By setting Content or
363 /// SerializableContent/NonSerializableContent properties, specific set of
364 /// properties can be reset.
368 // Set serializing flag
369 if(GetChartObject() != null)
371 GetChartObject().serializing = true;
372 GetChartObject().serializationStatus = SerializationStatus.Resetting;
376 _serializer.ResetObjectProperties(GetChartObject());
378 // Clear serializing flag
379 if(GetChartObject() != null)
381 GetChartObject().serializing = false;
382 GetChartObject().serializationStatus = SerializationStatus.None;
387 /// This method saves all properties of the chart into a file. By setting Content or
388 /// SerializableContent/NonSerializableContent properties, specific set of
389 /// properties can be saved.
391 /// <param name="fileName">The file name used to write the data.</param>
392 public void Save(string fileName)
395 if (fileName == null)
396 throw new ArgumentNullException("fileName");
398 // Set serializing flag
399 if(GetChartObject() != null)
401 GetChartObject().serializing = true;
402 GetChartObject().serializationStatus = SerializationStatus.Saving;
403 //GetChartObject().BeginInit();
406 // Reset all auto-detected properties values
407 GetChartObject().ResetAutoValues();
409 // Serialize chart data
410 _serializer.Serialize(GetChartObject(), fileName);
412 // Clear serializing flag
413 if(GetChartObject() != null)
415 GetChartObject().serializing = false;
416 GetChartObject().serializationStatus = SerializationStatus.None;
417 //GetChartObject().EndInit();
422 /// This method saves all properties of the chart into a stream. By setting Content or
423 /// SerializableContent/NonSerializableContent properties, specific set of
424 /// properties can be saved.
426 /// <param name="stream">The stream where to save the data.</param>
427 public void Save(Stream stream)
431 throw new ArgumentNullException("stream");
433 // Set serializing flag
434 if(GetChartObject() != null)
436 GetChartObject().serializing = true;
437 GetChartObject().serializationStatus = SerializationStatus.Saving;
438 //GetChartObject().BeginInit();
441 // Reset all auto-detected properties values
442 GetChartObject().ResetAutoValues();
444 // Serialize chart data
445 _serializer.Serialize(GetChartObject(), stream);
447 // Clear serializing flag
448 if(GetChartObject() != null)
450 GetChartObject().serializing = false;
451 GetChartObject().serializationStatus = SerializationStatus.None;
452 //GetChartObject().EndInit();
457 /// This method saves all properties of the chart into an XML writer. By setting Content or
458 /// SerializableContent/NonSerializableContent properties, specific set of
459 /// properties can be saved.
461 /// <param name="writer">XML writer to save the data.</param>
462 public void Save(XmlWriter writer)
466 throw new ArgumentNullException("writer");
468 // Set serializing flag
469 if(GetChartObject() != null)
471 GetChartObject().serializing = true;
472 GetChartObject().serializationStatus = SerializationStatus.Saving;
473 //GetChartObject().BeginInit();
476 // Reset all auto-detected properties values
477 GetChartObject().ResetAutoValues();
479 // Serialize chart data
480 _serializer.Serialize(GetChartObject(), writer);
482 // Clear serializing flag
483 if(GetChartObject() != null)
485 GetChartObject().serializing = false;
486 GetChartObject().serializationStatus = SerializationStatus.None;
487 //GetChartObject().EndInit();
492 /// This method saves all properties of the chart into a text writer. By setting Content or
493 /// SerializableContent/NonSerializableContent properties, specific set of
494 /// properties can be saved.
496 /// <param name="writer">Text writer to save the data.</param>
497 public void Save(TextWriter writer)
501 throw new ArgumentNullException("writer");
503 // Set serializing flag
504 if(GetChartObject() != null)
506 GetChartObject().serializing = true;
507 GetChartObject().serializationStatus = SerializationStatus.Saving;
508 //GetChartObject().BeginInit();
511 // Reset all auto-detected properties values
512 GetChartObject().ResetAutoValues();
514 // Serialize chart data
515 _serializer.Serialize(GetChartObject(), writer);
517 // Clear serializing flag
518 if(GetChartObject() != null)
520 GetChartObject().serializing = false;
521 GetChartObject().serializationStatus = SerializationStatus.None;
522 //GetChartObject().EndInit();
527 /// This method loads all properties of the chart from a file. By setting Content or
528 /// SerializableContent/NonSerializableContent properties, specific set of
529 /// properties can be loaded.
531 /// <param name="fileName">The file to load the data from.</param>
532 public void Load(string fileName)
535 if (fileName == null)
536 throw new ArgumentNullException("fileName");
538 // Set serializing flag
539 if(GetChartObject() != null)
541 GetChartObject().serializing = true;
542 GetChartObject().serializationStatus = SerializationStatus.Loading;
545 _serializer.Deserialize(GetChartObject(), fileName);
547 // Clear serializing flag
548 if(GetChartObject() != null)
550 GetChartObject().serializing = false;
551 GetChartObject().serializationStatus = SerializationStatus.None;
557 /// This method loads all properties of the chart from a stream. By setting Content or
558 /// SerializableContent/NonSerializableContent properties, specific set of
559 /// properties can be loaded.
561 /// <param name="stream">The stream to load the data from.</param>
562 public void Load(Stream stream)
566 throw new ArgumentNullException("stream");
568 // Set serializing flag
569 if(GetChartObject() != null)
571 GetChartObject().serializing = true;
572 GetChartObject().serializationStatus = SerializationStatus.Loading;
575 _serializer.Deserialize(GetChartObject(), stream);
577 // Clear serializing flag
578 if(GetChartObject() != null)
580 GetChartObject().serializing = false;
581 GetChartObject().serializationStatus = SerializationStatus.None;
586 /// This method loads all properties of the chart from an XML reader. By setting Content or
587 /// SerializableContent/NonSerializableContent properties, specific set of
588 /// properties can be loaded.
590 /// <param name="reader">The XML reader to load the data from.</param>
591 public void Load(XmlReader reader)
595 throw new ArgumentNullException("reader");
597 // Set serializing flag
598 if(GetChartObject() != null)
600 GetChartObject().serializing = true;
601 GetChartObject().serializationStatus = SerializationStatus.Loading;
604 _serializer.Deserialize(GetChartObject(), reader);
606 // Clear serializing flag
607 if(GetChartObject() != null)
609 GetChartObject().serializing = false;
610 GetChartObject().serializationStatus = SerializationStatus.None;
615 /// This method loads all properties of the chart from the text reader. By setting Content or
616 /// SerializableContent/NonSerializableContent properties, specific set of
617 /// properties can be loaded.
619 /// <param name="reader">The text reader to load the data from.</param>
620 public void Load(TextReader reader)
624 throw new ArgumentNullException("reader");
626 // Set serializing flag
627 if(GetChartObject() != null)
629 GetChartObject().serializing = true;
630 GetChartObject().serializationStatus = SerializationStatus.Loading;
633 _serializer.Deserialize(GetChartObject(), reader);
635 // Clear serializing flag
636 if(GetChartObject() != null)
638 GetChartObject().serializing = false;
639 GetChartObject().serializationStatus = SerializationStatus.None;
645 #region Protected helper methods
648 /// Sets SerializableContent and NonSerializableContent properties
649 /// depending on the flags in the Content property.
651 internal void SetSerializableContent()
653 // Reset content definition strings
654 this.SerializableContent = "";
655 this.NonSerializableContent = "";
657 // Loop through all enumeration flags
658 Array enumValues = Enum.GetValues(typeof(SerializationContents ));
659 foreach(object flagObject in enumValues)
661 if(flagObject is SerializationContents )
663 // Check if flag currently set
664 SerializationContents flag = (SerializationContents )flagObject;
665 if((this.Content & flag) == flag &&
666 flag != SerializationContents .All &&
667 this.Content != SerializationContents .All)
669 // Add comma at the end of existing string
670 if(this.NonSerializableContent.Length != 0)
672 this.NonSerializableContent += ", ";
675 // Add serializable class/properties names
676 this.NonSerializableContent += GetContentString(flag, false);
677 this.NonSerializableContent = this.NonSerializableContent.TrimStart(',');
679 // Add comma at the end of existing string
680 if(this.SerializableContent.Length != 0)
682 this.SerializableContent += ", ";
685 // Add serializable class/properties names
686 this.SerializableContent += GetContentString(flag, true);
687 this.SerializableContent = this.SerializableContent.TrimStart(',');
695 /// Return a serializable or non serializable class/properties names
696 /// for the specific flag.
698 /// <param name="content">Serializable content</param>
699 /// <param name="serializable">True - get serializable string, False - non serializable.</param>
700 /// <returns>Serializable or non serializable string with class/properties names.</returns>
701 protected string GetContentString(SerializationContents content, bool serializable)
705 case(SerializationContents .All):
707 case(SerializationContents .Default):
709 case(SerializationContents .Data):
713 "Chart.BuildNumber, " +
717 "DataPoint.XValue, " +
718 "DataPoint.YValues," +
719 "DataPoint.LabelStyle," +
720 "DataPoint.AxisLabel," +
721 "DataPoint.LabelFormat," +
722 "DataPoint.IsEmpty, " +
723 "Series.YValuesPerPoint, " +
724 "Series.IsXValueIndexed, " +
725 "Series.XValueType, " +
729 case(SerializationContents .Appearance):
733 "Chart.BuildNumber, " +
743 "*.PaletteCustomColors, " +
751 "*.MarkerBorderColor, " +
753 "*.MarkerImageTransparentColor, " +
754 "*.LabelBackColor, " +
757 "*.IsRightAngleAxes, " +
764 "*.PointGapDepth, " +
770 throw (new InvalidOperationException(SR.ExceptionChartSerializerContentFlagUnsupported));
775 /// Returns chart object for serialization.
777 /// <returns>Chart object.</returns>
778 internal Chart GetChartObject()
782 _chart = (Chart)_serviceContainer.GetService(typeof(Chart));