5 // Lluis Sanchez Gual (lluis@ximian.com)
7 // (C) 2002, 2003 Ximian, Inc. http://www.ximian.com
11 using System.Collections;
13 using System.Reflection;
15 using System.Xml.Schema;
18 namespace System.Xml.Serialization
21 public class XmlSerializer
26 XmlTypeMapping typeMapping;
32 protected XmlSerializer ()
36 public XmlSerializer (Type type)
37 : this (type, null, null, null, null)
41 public XmlSerializer (XmlTypeMapping xmlTypeMapping)
43 typeMapping = xmlTypeMapping;
46 public XmlSerializer (Type type, string defaultNamespace)
47 : this (type, null, null, null, defaultNamespace)
51 public XmlSerializer (Type type, Type[] extraTypes)
52 : this (type, null, extraTypes, null, null)
56 public XmlSerializer (Type type, XmlAttributeOverrides overrides)
57 : this (type, overrides, null, null, null)
61 public XmlSerializer (Type type, XmlRootAttribute root)
62 : this (type, null, null, root, null)
66 public XmlSerializer (Type type,
67 XmlAttributeOverrides overrides,
69 XmlRootAttribute root,
70 string defaultNamespace)
73 throw new ArgumentNullException ("type");
75 XmlReflectionImporter importer = new XmlReflectionImporter (overrides, defaultNamespace);
77 if (extraTypes != null)
\r
79 foreach (Type intype in extraTypes)
80 importer.IncludeType (intype);
83 typeMapping = importer.ImportTypeMapping (type, root, defaultNamespace);
86 #endregion // Constructors
90 private XmlAttributeEventHandler onUnknownAttribute;
91 private XmlElementEventHandler onUnknownElement;
92 private XmlNodeEventHandler onUnknownNode;
93 private UnreferencedObjectEventHandler onUnreferencedObject;
95 public event XmlAttributeEventHandler UnknownAttribute
97 add { onUnknownAttribute += value; } remove { onUnknownAttribute -= value; }
100 public event XmlElementEventHandler UnknownElement
102 add { onUnknownElement += value; } remove { onUnknownElement -= value; }
105 public event XmlNodeEventHandler UnknownNode
107 add { onUnknownNode += value; } remove { onUnknownNode -= value; }
110 public event UnreferencedObjectEventHandler UnreferencedObject
112 add { onUnreferencedObject += value; } remove { onUnreferencedObject -= value; }
116 internal virtual void OnUnknownAttribute (XmlAttributeEventArgs e)
118 if (onUnknownAttribute != null) onUnknownAttribute(this, e);
121 internal virtual void OnUnknownElement (XmlElementEventArgs e)
123 if (onUnknownElement != null) onUnknownElement(this, e);
126 internal virtual void OnUnknownNode (XmlNodeEventArgs e)
128 if (onUnknownNode != null) onUnknownNode(this, e);
131 internal virtual void OnUnreferencedObject (UnreferencedObjectEventArgs e)
133 if (onUnreferencedObject != null) onUnreferencedObject(this, e);
141 [MonoTODO ("Implement.")]
142 public virtual bool CanDeserialize (XmlReader xmlReader)
144 xmlReader.MoveToContent ();
145 return typeMapping.ElementName == xmlReader.LocalName;
148 protected virtual XmlSerializationReader CreateReader ()
150 return new XmlSerializationReaderInterpreter (typeMapping);
153 protected virtual XmlSerializationWriter CreateWriter ()
155 return new XmlSerializationWriterInterpreter (typeMapping);
158 public object Deserialize (Stream stream)
160 XmlTextReader xmlReader = new XmlTextReader(stream);
161 return Deserialize(xmlReader);
164 public object Deserialize (TextReader textReader)
166 XmlTextReader xmlReader = new XmlTextReader(textReader);
167 return Deserialize(xmlReader);
170 public object Deserialize (XmlReader xmlReader)
172 XmlSerializationReader xsReader = CreateReader ();
173 xsReader.Initialize (xmlReader, this);
174 return Deserialize (xsReader);
177 protected virtual object Deserialize (XmlSerializationReader reader)
179 return reader.ReadObject ();
182 public static XmlSerializer [] FromMappings (XmlMapping [] mappings)
184 XmlSerializer [] sers = new XmlSerializer [mappings.Length];
185 for (int n=0; n<mappings.Length; n++)
187 XmlTypeMapping map = mappings[n] as XmlTypeMapping;
188 if (map == null) throw new NotSupportedException ("Unsupported mapping type");
189 sers[n] = new XmlSerializer (map);
194 public static XmlSerializer [] FromTypes (Type [] mappings)
196 XmlSerializer [] sers = new XmlSerializer [mappings.Length];
197 for (int n=0; n<mappings.Length; n++)
198 sers[n] = new XmlSerializer (mappings[n]);
202 protected virtual void Serialize (object o, XmlSerializationWriter writer)
204 writer.WriteObject (o);
207 public void Serialize (Stream stream, object o)
209 XmlTextWriter xmlWriter = new XmlTextWriter (stream, System.Text.Encoding.Default);
210 xmlWriter.Formatting = Formatting.Indented;
211 Serialize (xmlWriter, o, null);
214 public void Serialize (TextWriter textWriter, object o)
216 XmlTextWriter xmlWriter = new XmlTextWriter (textWriter);
217 xmlWriter.Formatting = Formatting.Indented;
218 Serialize (xmlWriter, o, null);
221 public void Serialize (XmlWriter xmlWriter, object o)
223 Serialize (xmlWriter, o, null);
226 public void Serialize (Stream stream, object o, XmlSerializerNamespaces namespaces)
228 XmlTextWriter xmlWriter = new XmlTextWriter (stream, System.Text.Encoding.Default);
229 xmlWriter.Formatting = Formatting.Indented;
230 Serialize (xmlWriter, o, namespaces);
233 public void Serialize (TextWriter textWriter, object o, XmlSerializerNamespaces namespaces)
235 XmlTextWriter xmlWriter = new XmlTextWriter (textWriter);
236 xmlWriter.Formatting = Formatting.Indented;
237 Serialize (xmlWriter, o, namespaces);
241 public void Serialize (XmlWriter writer, object o, XmlSerializerNamespaces namespaces)
243 writer.WriteStartDocument ();
244 XmlSerializationWriter xsWriter = CreateWriter ();
245 xsWriter.Initialize (writer);
246 Serialize (o, xsWriter);
247 writer.WriteEndDocument();
250 #endregion // Methods