// // XmlSerializer.cs: // // Author: // Lluis Sanchez Gual (lluis@ximian.com) // // (C) 2002, 2003 Ximian, Inc. http://www.ximian.com // using System; using System.Collections; using System.IO; using System.Reflection; using System.Xml; using System.Xml.Schema; using System.Text; namespace System.Xml.Serialization { public class XmlSerializer { #region Fields XmlTypeMapping typeMapping; #endregion // Fields #region Constructors protected XmlSerializer () { } public XmlSerializer (Type type) : this (type, null, null, null, null) { } public XmlSerializer (XmlTypeMapping xmlTypeMapping) { typeMapping = xmlTypeMapping; } public XmlSerializer (Type type, string defaultNamespace) : this (type, null, null, null, defaultNamespace) { } public XmlSerializer (Type type, Type[] extraTypes) : this (type, null, extraTypes, null, null) { } public XmlSerializer (Type type, XmlAttributeOverrides overrides) : this (type, overrides, null, null, null) { } public XmlSerializer (Type type, XmlRootAttribute root) : this (type, null, null, root, null) { } public XmlSerializer (Type type, XmlAttributeOverrides overrides, Type [] extraTypes, XmlRootAttribute root, string defaultNamespace) { if (type == null) throw new ArgumentNullException ("type"); XmlReflectionImporter importer = new XmlReflectionImporter (overrides, defaultNamespace); if (extraTypes != null) { foreach (Type intype in extraTypes) importer.IncludeType (intype); } typeMapping = importer.ImportTypeMapping (type, root, defaultNamespace); } #endregion // Constructors #region Events private XmlAttributeEventHandler onUnknownAttribute; private XmlElementEventHandler onUnknownElement; private XmlNodeEventHandler onUnknownNode; private UnreferencedObjectEventHandler onUnreferencedObject; public event XmlAttributeEventHandler UnknownAttribute { add { onUnknownAttribute += value; } remove { onUnknownAttribute -= value; } } public event XmlElementEventHandler UnknownElement { add { onUnknownElement += value; } remove { onUnknownElement -= value; } } public event XmlNodeEventHandler UnknownNode { add { onUnknownNode += value; } remove { onUnknownNode -= value; } } public event UnreferencedObjectEventHandler UnreferencedObject { add { onUnreferencedObject += value; } remove { onUnreferencedObject -= value; } } internal virtual void OnUnknownAttribute (XmlAttributeEventArgs e) { if (onUnknownAttribute != null) onUnknownAttribute(this, e); } internal virtual void OnUnknownElement (XmlElementEventArgs e) { if (onUnknownElement != null) onUnknownElement(this, e); } internal virtual void OnUnknownNode (XmlNodeEventArgs e) { if (onUnknownNode != null) onUnknownNode(this, e); } internal virtual void OnUnreferencedObject (UnreferencedObjectEventArgs e) { if (onUnreferencedObject != null) onUnreferencedObject(this, e); } #endregion // Events #region Methods [MonoTODO ("Implement.")] public virtual bool CanDeserialize (XmlReader xmlReader) { xmlReader.MoveToContent (); return typeMapping.ElementName == xmlReader.LocalName; } protected virtual XmlSerializationReader CreateReader () { return new XmlSerializationReaderInterpreter (typeMapping); } protected virtual XmlSerializationWriter CreateWriter () { return new XmlSerializationWriterInterpreter (typeMapping); } public object Deserialize (Stream stream) { XmlTextReader xmlReader = new XmlTextReader(stream); return Deserialize(xmlReader); } public object Deserialize (TextReader textReader) { XmlTextReader xmlReader = new XmlTextReader(textReader); return Deserialize(xmlReader); } public object Deserialize (XmlReader xmlReader) { XmlSerializationReader xsReader = CreateReader (); xsReader.Initialize (xmlReader, this); return Deserialize (xsReader); } protected virtual object Deserialize (XmlSerializationReader reader) { return reader.ReadObject (); } public static XmlSerializer [] FromMappings (XmlMapping [] mappings) { XmlSerializer [] sers = new XmlSerializer [mappings.Length]; for (int n=0; n