XmlSerializer.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. //
  2. // XmlSerializer.cs:
  3. //
  4. // Author:
  5. // Lluis Sanchez Gual ([email protected])
  6. //
  7. // (C) 2002, 2003 Ximian, Inc. http://www.ximian.com
  8. //
  9. using System;
  10. using System.Collections;
  11. using System.IO;
  12. using System.Reflection;
  13. using System.Xml;
  14. using System.Xml.Schema;
  15. using System.Text;
  16. namespace System.Xml.Serialization
  17. {
  18. public class XmlSerializer
  19. {
  20. #region Fields
  21. XmlMapping typeMapping;
  22. #endregion // Fields
  23. #region Constructors
  24. protected XmlSerializer ()
  25. {
  26. }
  27. public XmlSerializer (Type type)
  28. : this (type, null, null, null, null)
  29. {
  30. }
  31. public XmlSerializer (XmlTypeMapping xmlTypeMapping)
  32. {
  33. typeMapping = xmlTypeMapping;
  34. }
  35. internal XmlSerializer (XmlMapping mapping)
  36. {
  37. typeMapping = mapping;
  38. }
  39. public XmlSerializer (Type type, string defaultNamespace)
  40. : this (type, null, null, null, defaultNamespace)
  41. {
  42. }
  43. public XmlSerializer (Type type, Type[] extraTypes)
  44. : this (type, null, extraTypes, null, null)
  45. {
  46. }
  47. public XmlSerializer (Type type, XmlAttributeOverrides overrides)
  48. : this (type, overrides, null, null, null)
  49. {
  50. }
  51. public XmlSerializer (Type type, XmlRootAttribute root)
  52. : this (type, null, null, root, null)
  53. {
  54. }
  55. public XmlSerializer (Type type,
  56. XmlAttributeOverrides overrides,
  57. Type [] extraTypes,
  58. XmlRootAttribute root,
  59. string defaultNamespace)
  60. {
  61. if (type == null)
  62. throw new ArgumentNullException ("type");
  63. XmlReflectionImporter importer = new XmlReflectionImporter (overrides, defaultNamespace);
  64. if (extraTypes != null)
  65. {
  66. foreach (Type intype in extraTypes)
  67. importer.IncludeType (intype);
  68. }
  69. typeMapping = importer.ImportTypeMapping (type, root, defaultNamespace);
  70. }
  71. #endregion // Constructors
  72. #region Events
  73. private XmlAttributeEventHandler onUnknownAttribute;
  74. private XmlElementEventHandler onUnknownElement;
  75. private XmlNodeEventHandler onUnknownNode;
  76. private UnreferencedObjectEventHandler onUnreferencedObject;
  77. public event XmlAttributeEventHandler UnknownAttribute
  78. {
  79. add { onUnknownAttribute += value; } remove { onUnknownAttribute -= value; }
  80. }
  81. public event XmlElementEventHandler UnknownElement
  82. {
  83. add { onUnknownElement += value; } remove { onUnknownElement -= value; }
  84. }
  85. public event XmlNodeEventHandler UnknownNode
  86. {
  87. add { onUnknownNode += value; } remove { onUnknownNode -= value; }
  88. }
  89. public event UnreferencedObjectEventHandler UnreferencedObject
  90. {
  91. add { onUnreferencedObject += value; } remove { onUnreferencedObject -= value; }
  92. }
  93. internal virtual void OnUnknownAttribute (XmlAttributeEventArgs e)
  94. {
  95. if (onUnknownAttribute != null) onUnknownAttribute(this, e);
  96. }
  97. internal virtual void OnUnknownElement (XmlElementEventArgs e)
  98. {
  99. if (onUnknownElement != null) onUnknownElement(this, e);
  100. }
  101. internal virtual void OnUnknownNode (XmlNodeEventArgs e)
  102. {
  103. if (onUnknownNode != null) onUnknownNode(this, e);
  104. }
  105. internal virtual void OnUnreferencedObject (UnreferencedObjectEventArgs e)
  106. {
  107. if (onUnreferencedObject != null) onUnreferencedObject(this, e);
  108. }
  109. #endregion // Events
  110. #region Methods
  111. [MonoTODO ("Implement.")]
  112. public virtual bool CanDeserialize (XmlReader xmlReader)
  113. {
  114. xmlReader.MoveToContent ();
  115. if (typeMapping is XmlMembersMapping)
  116. return true;
  117. else
  118. return ((XmlTypeMapping)typeMapping).ElementName == xmlReader.LocalName;
  119. }
  120. protected virtual XmlSerializationReader CreateReader ()
  121. {
  122. // Must be implemented in derived class
  123. throw new NotImplementedException ();
  124. }
  125. protected virtual XmlSerializationWriter CreateWriter ()
  126. {
  127. // Must be implemented in derived class
  128. throw new NotImplementedException ();
  129. }
  130. public object Deserialize (Stream stream)
  131. {
  132. XmlTextReader xmlReader = new XmlTextReader(stream);
  133. return Deserialize(xmlReader);
  134. }
  135. public object Deserialize (TextReader textReader)
  136. {
  137. XmlTextReader xmlReader = new XmlTextReader(textReader);
  138. return Deserialize(xmlReader);
  139. }
  140. public object Deserialize (XmlReader xmlReader)
  141. {
  142. XmlSerializationReader xsReader;
  143. if (typeMapping == null)
  144. xsReader = CreateReader ();
  145. else
  146. xsReader = new XmlSerializationReaderInterpreter (typeMapping);
  147. xsReader.Initialize (xmlReader, this);
  148. return Deserialize (xsReader);
  149. }
  150. protected virtual object Deserialize (XmlSerializationReader reader)
  151. {
  152. if (typeMapping == null)
  153. {
  154. XmlSerializationReaderInterpreter rd = reader as XmlSerializationReaderInterpreter;
  155. if (rd == null) throw new InvalidOperationException ();
  156. return rd.ReadObject ();
  157. }
  158. else
  159. // Must be implemented in derived class
  160. throw new NotImplementedException ();
  161. }
  162. public static XmlSerializer [] FromMappings (XmlMapping [] mappings)
  163. {
  164. XmlSerializer [] sers = new XmlSerializer [mappings.Length];
  165. for (int n=0; n<mappings.Length; n++)
  166. sers[n] = new XmlSerializer (mappings[n]);
  167. return sers;
  168. }
  169. public static XmlSerializer [] FromTypes (Type [] mappings)
  170. {
  171. XmlSerializer [] sers = new XmlSerializer [mappings.Length];
  172. for (int n=0; n<mappings.Length; n++)
  173. sers[n] = new XmlSerializer (mappings[n]);
  174. return sers;
  175. }
  176. protected virtual void Serialize (object o, XmlSerializationWriter writer)
  177. {
  178. if (typeMapping != null)
  179. {
  180. XmlSerializationWriterInterpreter wr = writer as XmlSerializationWriterInterpreter;
  181. if (wr == null) throw new InvalidOperationException ();
  182. wr.WriteObject (o);
  183. }
  184. else
  185. // Must be implemented in derived class
  186. throw new NotImplementedException ();
  187. }
  188. public void Serialize (Stream stream, object o)
  189. {
  190. XmlTextWriter xmlWriter = new XmlTextWriter (stream, System.Text.Encoding.Default);
  191. xmlWriter.Formatting = Formatting.Indented;
  192. Serialize (xmlWriter, o, null);
  193. }
  194. public void Serialize (TextWriter textWriter, object o)
  195. {
  196. XmlTextWriter xmlWriter = new XmlTextWriter (textWriter);
  197. xmlWriter.Formatting = Formatting.Indented;
  198. Serialize (xmlWriter, o, null);
  199. }
  200. public void Serialize (XmlWriter xmlWriter, object o)
  201. {
  202. Serialize (xmlWriter, o, null);
  203. }
  204. public void Serialize (Stream stream, object o, XmlSerializerNamespaces namespaces)
  205. {
  206. XmlTextWriter xmlWriter = new XmlTextWriter (stream, System.Text.Encoding.Default);
  207. xmlWriter.Formatting = Formatting.Indented;
  208. Serialize (xmlWriter, o, namespaces);
  209. }
  210. public void Serialize (TextWriter textWriter, object o, XmlSerializerNamespaces namespaces)
  211. {
  212. XmlTextWriter xmlWriter = new XmlTextWriter (textWriter);
  213. xmlWriter.Formatting = Formatting.Indented;
  214. Serialize (xmlWriter, o, namespaces);
  215. xmlWriter.Flush();
  216. }
  217. public void Serialize (XmlWriter writer, object o, XmlSerializerNamespaces namespaces)
  218. {
  219. XmlSerializationWriter xsWriter;
  220. if (typeMapping == null)
  221. xsWriter = CreateWriter ();
  222. else
  223. xsWriter = new XmlSerializationWriterInterpreter (typeMapping);
  224. xsWriter.Initialize (writer, namespaces);
  225. Serialize (o, xsWriter);
  226. writer.Flush ();
  227. }
  228. #endregion // Methods
  229. }
  230. }