* TypeData.cs, TypeTranslator.cs: Renamed some properties.
authorLluis Sanchez <lluis@novell.com>
Thu, 29 May 2003 20:14:18 +0000 (20:14 -0000)
committerLluis Sanchez <lluis@novell.com>
Thu, 29 May 2003 20:14:18 +0000 (20:14 -0000)
* XmlCustomFormatter.cs: Fixed bug in serialization of chars. Support for byte[].
* XmlMapping.cs: Added internal property.
* XmlMemberMapping.cs, XmlMembersMapping.cs: Implemented.
* XmlReflectionImporter.cs: Implemented importing of XmlMembersMapping. Several fixes.
* XmlReflectionMember.cs: XmlAttributes are now created by default
* XmlSerializationReader.cs, XmlSerializationWriter.cs: Several fixes.
* XmlSerializationReaderInterpreter.cs, XmlSerializationWriterInterpreter.cs, XmlSerializer.cs:
  Implemented support for XmlMembersMapping.
* XmlTypeMapping.cs: Property ObjectMap moved to XmlMapping.

svn path=/trunk/mcs/; revision=14997

14 files changed:
mcs/class/System.XML/System.Xml.Serialization/ChangeLog
mcs/class/System.XML/System.Xml.Serialization/TypeData.cs
mcs/class/System.XML/System.Xml.Serialization/TypeTranslator.cs
mcs/class/System.XML/System.Xml.Serialization/XmlMapping.cs
mcs/class/System.XML/System.Xml.Serialization/XmlMemberMapping.cs
mcs/class/System.XML/System.Xml.Serialization/XmlMembersMapping.cs
mcs/class/System.XML/System.Xml.Serialization/XmlReflectionImporter.cs
mcs/class/System.XML/System.Xml.Serialization/XmlReflectionMember.cs
mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReader.cs
mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs
mcs/class/System.XML/System.Xml.Serialization/XmlSerializationWriter.cs
mcs/class/System.XML/System.Xml.Serialization/XmlSerializationWriterInterpreter.cs
mcs/class/System.XML/System.Xml.Serialization/XmlSerializer.cs
mcs/class/System.XML/System.Xml.Serialization/XmlTypeMapping.cs

index a199fa1b5050c31055baad06e4db27587c68cd9b..c6dff52e438ce088e545d7fec3b8fc131d21a6b0 100755 (executable)
@@ -1,3 +1,16 @@
+2003-05-29  Lluis Sanchez Gual <lluis@ximian.com>
+
+       * TypeData.cs, TypeTranslator.cs: Renamed some properties.
+       * XmlCustomFormatter.cs: Fixed bug in serialization of chars. Support for byte[].
+       * XmlMapping.cs: Added internal property.
+       * XmlMemberMapping.cs, XmlMembersMapping.cs: Implemented.
+       * XmlReflectionImporter.cs: Implemented importing of XmlMembersMapping. Several fixes.
+       * XmlReflectionMember.cs: XmlAttributes are now created by default
+       * XmlSerializationReader.cs, XmlSerializationWriter.cs: Several fixes.
+       * XmlSerializationReaderInterpreter.cs, XmlSerializationWriterInterpreter.cs, XmlSerializer.cs: 
+         Implemented support for XmlMembersMapping.
+       * XmlTypeMapping.cs: Property ObjectMap moved to XmlMapping.
+
 2003-05-28  Lluis Sanchez Gual <lluis@ximian.com>
 
        * TypeData.cs, TypeTranslator.cs: Added support for enums. Added method for translating
index 3d13a2a537a10a3d166f52f66d94ad442909e927..21eb3ae9a4a0bf3aec40455df0f2e28b9f6251ff 100644 (file)
@@ -41,17 +41,17 @@ namespace System.Xml.Serialization
                        }
                }
 
-               public string ElementName
+               public string TypeName
                {
                        get {
-                               return elementName;
+                               return type.Name;
                        }
                }
                                
-               public string TypeName
+               public string XmlType
                {
                        get {
-                               return type.Name;
+                               return elementName;
                        }
                }
                                
index a347169c11d9cf7bb6d091c33b4b43f3d1e5fee8..d6a2ead8336aa9f88b24858c32b2d23418d9ab41 100644 (file)
@@ -48,7 +48,7 @@ namespace System.Xml.Serialization
                        primitiveTypes = new Hashtable();
                        ICollection types = nameCache.Values;
                        foreach (TypeData td in types)
-                               primitiveTypes.Add (td.ElementName, td);
+                               primitiveTypes.Add (td.XmlType, td);
                }
 
                public static TypeData GetTypeData (Type type)
@@ -58,7 +58,7 @@ namespace System.Xml.Serialization
                        
                        string name;
                        if (type.IsArray) {
-                               string sufix = GetTypeData (type.GetElementType ()).ElementName;
+                               string sufix = GetTypeData (type.GetElementType ()).XmlType;
                                name = "ArrayOf" + Char.ToUpper (sufix [0]) + sufix.Substring (1);
                        }
                        else 
index a989e674218d5f6de99bd67d7f41690aff44649e..75fafc304dcf55020b4ef372e1af1ec1083e8084 100644 (file)
@@ -3,21 +3,31 @@
 //
 // Author:
 //   John Donagher (john@webmeta.com)
+//   Lluis Sanchez Gual (lluis@ximian.com)
 //
 // (C) 2002 John Donagher
 //
 
-using System;\r
-\r
-namespace System.Xml.Serialization\r
-{\r
-       /// <summary>\r
-       /// Summary description for XmlMapping.\r
-       /// </summary>\r
-       public abstract class XmlMapping\r
-       {\r
+using System;
+
+namespace System.Xml.Serialization
+{
+       public abstract class XmlMapping
+       {
+               ObjectMap map;
+
                internal XmlMapping ()
                {
                }
-       }\r
-}\r
+
+               internal ObjectMap ObjectMap
+               {
+                       get { return map; }
+                       set { map = value; }
+               }
+       }
+
+       internal class ObjectMap
+       {
+       }
+}
index 8c222aa8b82a1c4212d631763414215e79ed8bc4..c49a019be17e4620c607e6ce89e14b1e28a9c767 100644 (file)
@@ -1,56 +1,80 @@
-// \r
-// System.Xml.Serialization.XmlMemberMapping\r
-//\r
-// Author:\r
-//   Tim Coleman (tim@timcoleman.com)\r
-//\r
-// Copyright (C) Tim Coleman, 2002\r
-//\r
-\r
-namespace System.Xml.Serialization {\r
-       public class XmlMemberMapping {\r
-\r
-               internal XmlMemberMapping ()\r
-               {\r
-               }\r
-\r
-               #region Properties\r
-\r
-               public bool Any {       \r
-                       [MonoTODO]\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               public string ElementName {     \r
-                       [MonoTODO]\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               public string MemberName {      \r
-                       [MonoTODO]\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               public string Namespace {\r
-                       [MonoTODO]\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               public string TypeFullName {\r
-                       [MonoTODO]\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               public string TypeName {\r
-                       [MonoTODO]\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               public string TypeNamespace {\r
-                       [MonoTODO]\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               #endregion // Properties\r
-       }\r
-}\r
+// 
+// System.Xml.Serialization.XmlMemberMapping
+//
+// Author:
+//   Tim Coleman (tim@timcoleman.com)
+//   Lluis Sanchez Gual (lluis@ximian.com)
+//
+// Copyright (C) Tim Coleman, 2002
+//
+
+namespace System.Xml.Serialization 
+{
+       public class XmlMemberMapping {
+
+               XmlTypeMapMember _mapMember;
+               string _elementName;
+               string _memberName;
+               string _namespace;
+               string _typeNamespace;
+
+               internal XmlMemberMapping (XmlReflectionMember rmember, XmlTypeMapMember mapMem)
+               {
+                       _mapMember = mapMem;
+                       _memberName = rmember.MemberName;
+
+                       if (mapMem is XmlTypeMapMemberElement)
+                       {
+                               XmlTypeMapElementInfo info = (XmlTypeMapElementInfo) ((XmlTypeMapMemberElement)mapMem).ElementInfo[0];
+                               _elementName = info.ElementName;
+                               _namespace = info.Namespace;
+                               if (info.MappedType != null) _typeNamespace = info.MappedType.Namespace;
+                               else _namespace = "";
+                       }
+                       else
+                       {
+                               _elementName = _memberName;
+                               _namespace = "";
+                       }
+
+                       if (_typeNamespace == null) _typeNamespace = _namespace;
+               }
+
+               #region Properties
+
+               public bool Any {       
+                       [MonoTODO]
+                       get { return false; }
+               }
+
+               public string ElementName {     
+                       get { return _elementName; }
+               }
+
+               public string MemberName {      
+                       get { return _memberName; }
+               }
+
+               public string Namespace {
+                       get { return _namespace; }
+               }
+
+               public string TypeFullName {
+                       get { return _mapMember.TypeData.FullTypeName; }
+               }
+
+               public string TypeName {
+                       get { return _mapMember.TypeData.XmlType; }
+               }
+
+               public string TypeNamespace {
+                       get { return _typeNamespace; }
+               }
+
+               internal XmlTypeMapMember TypeMapMember {
+                       get { return _mapMember; }
+               }
+
+               #endregion // Properties
+       }
+}
index ebd9b6bc60d4344c0954b90094f5840b7eefa0e3..44440f7ae53b7757ba6927071f71b5a38568567d 100644 (file)
@@ -1,53 +1,72 @@
-// \r
-// System.Xml.Serialization.XmlMembersMapping\r
-//\r
-// Author:\r
-//   Tim Coleman (tim@timcoleman.com)\r
-//\r
-// Copyright (C) Tim Coleman, 2002\r
-//\r
-\r
-using System.Reflection;\r
-\r
-namespace System.Xml.Serialization {\r
-       public class XmlMembersMapping : XmlMapping {\r
-\r
-               internal XmlMembersMapping ()\r
-               {\r
-               }\r
-\r
-               #region Properties\r
-\r
-               public int Count {      \r
-                       [MonoTODO]\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               public string ElementName {     \r
-                       [MonoTODO]\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               public XmlMemberMapping this [int index] {      \r
-                       [MonoTODO]\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               public string Namespace {\r
-                       [MonoTODO]\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               public string TypeName {\r
-                       [MonoTODO]\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               public string TypeNamespace {\r
-                       [MonoTODO]\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               #endregion // Properties\r
-       }\r
-}\r
+// 
+// System.Xml.Serialization.XmlMembersMapping
+//
+// Author:
+//   Tim Coleman (tim@timcoleman.com)
+//   Lluis Sanchez Gual (lluis@ximian.com)
+//
+// Copyright (C) Tim Coleman, 2002
+//
+
+using System.Reflection;
+
+namespace System.Xml.Serialization {
+       public class XmlMembersMapping : XmlMapping {
+
+               string _elementName;
+               string _namespace;
+               bool _hasWrapperElement;
+               XmlMemberMapping[] _mapping;
+
+               internal XmlMembersMapping ()
+               {
+               }
+
+               internal XmlMembersMapping (string elementName, string ns, bool hasWrapperElement, XmlMemberMapping[] mapping)
+               {
+                       _elementName = elementName;
+                       _namespace = ns;
+                       _hasWrapperElement = hasWrapperElement;
+                       _mapping = mapping;
+
+                       ClassMap map = new ClassMap ();
+                       foreach (XmlMemberMapping mm in mapping)
+                               map.AddMember (mm.TypeMapMember);
+                       ObjectMap = map;
+               }
+
+               #region Properties
+
+               public int Count {      
+                       get { return _mapping.Length; }
+               }
+
+               public string ElementName {     
+                       get { return _elementName; }
+               }
+
+               public XmlMemberMapping this [int index] {      
+                       get { return _mapping[index]; }
+               }
+
+               public string Namespace {
+                       get { return _namespace; }
+               }
+
+               public string TypeName {
+                       [MonoTODO]
+                       get { throw new NotImplementedException (); }
+               }
+
+               public string TypeNamespace {
+                       [MonoTODO]
+                       get { throw new NotImplementedException (); }
+               }
+
+               internal bool HasWrapperElement {
+                       get { return _hasWrapperElement; }
+               }
+
+               #endregion // Properties
+       }
+}
index 1636d2e689d2f1c749a024dc63df9ca9233961eb..b1ab9f13f7b1433bfc1584f3cb6b266a5c626406 100644 (file)
@@ -57,13 +57,18 @@ namespace System.Xml.Serialization {
 
                #region Methods
 
-               [MonoTODO]
                public XmlMembersMapping ImportMembersMapping (string elementName,
                        string ns,
                        XmlReflectionMember [] members,
                        bool hasWrapperElement)
                {
-                       throw new NotImplementedException ();
+                       XmlMemberMapping[] mapping = new XmlMemberMapping[members.Length];
+                       for (int n=0; n<members.Length; n++)
+                       {
+                               XmlTypeMapMember mapMem = CreateMapMember (members[n], ns);
+                               mapping[n] = new XmlMemberMapping (members[n], mapMem);
+                       }
+                       return new XmlMembersMapping (elementName, ns, hasWrapperElement, mapping);
                }
 
                public XmlTypeMapping ImportTypeMapping (Type type)
@@ -109,7 +114,7 @@ namespace System.Xml.Serialization {
                        string membersNamespace = defaultNamespace;
                        string elementName;
                        XmlAttributes atts = null;
-                       if (defaultXmlType == null) defaultXmlType = typeData.ElementName;
+                       if (defaultXmlType == null) defaultXmlType = typeData.XmlType;
 
                        if (!typeData.IsListType)
                        {
@@ -158,15 +163,22 @@ namespace System.Xml.Serialization {
                        RegisterClrType (map, type, defaultNamespace);
                        RegisterSchemaType (map, map.XmlType, defaultNamespace);
 
-                       map.ObjectMap = new ClassMap ();
+                       ClassMap classMap = new ClassMap ();
+                       map.ObjectMap = classMap;
 
                        // Import members
 
-                       ICollection members = GetReflectionMembers (type);
-                       foreach (XmlReflectionMember rmember in members)
+                       try
                        {
-                               if (rmember.XmlAttributes.XmlIgnore) continue;
-                               AddMember (map, rmember, map.Namespace);
+                               ICollection members = GetReflectionMembers (type);
+                               foreach (XmlReflectionMember rmember in members)
+                               {
+                                       if (rmember.XmlAttributes.XmlIgnore) continue;
+                                       classMap.AddMember (CreateMapMember (rmember, map.Namespace));
+                               }
+                       }
+                       catch (Exception ex) {
+                               throw CreateError (map, ex.Message);
                        }
 
                        // Import derived classes
@@ -225,7 +237,7 @@ namespace System.Xml.Serialization {
 
                                if (att.ElementName != null) elem.ElementName = att.ElementName;
                                else if (elem.MappedType != null) elem.ElementName = elem.MappedType.ElementName;
-                               else elem.ElementName = TypeTranslator.GetTypeData(elemType).ElementName;
+                               else elem.ElementName = TypeTranslator.GetTypeData(elemType).XmlType;
 
                                list.Add (elem);
                        }
@@ -239,7 +251,7 @@ namespace System.Xml.Serialization {
                                        elem.MappedType = ImportTypeMapping (itemType, null, defaultNamespace);
 
                                if (elem.MappedType != null) elem.ElementName = elem.MappedType.ElementName;
-                               else elem.ElementName = TypeTranslator.GetTypeData(itemType).ElementName ;
+                               else elem.ElementName = TypeTranslator.GetTypeData(itemType).XmlType ;
 
                                elem.Namespace = (defaultNamespace != null) ? defaultNamespace : "";
                                elem.IsNullable = true; // By default, items are nullable
@@ -368,7 +380,7 @@ namespace System.Xml.Serialization {
                        return members;
                }
                
-               private void AddMember (XmlTypeMapping map, XmlReflectionMember rmember, string defaultNamespace)
+               private XmlTypeMapMember CreateMapMember (XmlReflectionMember rmember, string defaultNamespace)
                {
                        XmlTypeMapMember mapMember;
                        XmlAttributes atts = rmember.XmlAttributes;
@@ -402,7 +414,7 @@ namespace System.Xml.Serialization {
                                // An attribute
 
                                if (atts.XmlElements != null && atts.XmlElements.Count > 0)
-                                       throw CreateError (map, "XmlAttributeAttribute and XmlElementAttribute cannot be applied to the same member");
+                                       throw new Exception ("XmlAttributeAttribute and XmlElementAttribute cannot be applied to the same member");
 
                                XmlTypeMapMemberAttribute mapAttribute = new XmlTypeMapMemberAttribute ();
                                if (atts.XmlAttribute.AttributeName == null) 
@@ -458,7 +470,7 @@ namespace System.Xml.Serialization {
 
                        mapMember.TypeData = typeData;
                        mapMember.Name = rmember.MemberName;
-                       ((ClassMap)map.ObjectMap).AddMember (mapMember);
+                       return mapMember;
                }
 
                XmlTypeMapElementInfoList ImportElementInfo (string defaultName, string defaultNamespace, Type defaultType, XmlTypeMapMemberElement member, XmlAttributes atts)
@@ -475,6 +487,7 @@ namespace System.Xml.Serialization {
                                list.Add (elem);
                        }
 
+                       bool multiType = (atts.XmlElements.Count > 1);
                        foreach (XmlElementAttribute att in atts.XmlElements)
                        {
                                Type elemType = (att.Type != null) ? att.Type : defaultType;
@@ -486,6 +499,16 @@ namespace System.Xml.Serialization {
                                elem.IsNullable = att.IsNullable;
                                if (elem.TypeData.IsComplexType)
                                        elem.MappedType = ImportTypeMapping (elemType, null, elem.Namespace);
+
+                               if (att.ElementName != null) 
+                                       elem.ElementName = att.ElementName;
+                               else if (multiType) {
+                                       if (elem.MappedType != null) elem.ElementName = elem.MappedType.ElementName;
+                                       else elem.ElementName = TypeTranslator.GetTypeData(elemType).XmlType;
+                               }
+                               else
+                                       elem.ElementName = defaultName;
+
                                list.Add (elem);
                        }
                        return list;
@@ -544,7 +567,7 @@ namespace System.Xml.Serialization {
 
                Exception CreateError (XmlTypeMapping map, string message)
                {
-                       throw new InvalidOperationException ("There was an error reflecting '" + map.TypeFullName + "': " + message);
+                       return new InvalidOperationException ("There was an error reflecting '" + map.TypeFullName + "': " + message);
                }
 
                #endregion // Methods
index 5be002cca2e5111ef3df479160dd60eb88691a43..61b0296b8033522be6da9c35f1fb6d143565b0e7 100644 (file)
@@ -59,12 +59,18 @@ namespace System.Xml.Serialization {
                }\r
 \r
                public SoapAttributes SoapAttributes {\r
-                       get { return soapAttributes; }\r
+                       get { \r
+                               if (soapAttributes == null) soapAttributes = new SoapAttributes();\r
+                               return soapAttributes; \r
+                       }\r
                        set { soapAttributes = value; }\r
                }\r
 \r
                public XmlAttributes XmlAttributes {\r
-                       get { return xmlAttributes; }\r
+                       get { \r
+                               if (xmlAttributes == null) xmlAttributes = new XmlAttributes();\r
+                               return xmlAttributes; \r
+                       }\r
                        set { xmlAttributes = value; }\r
                }\r
 \r
index 9e004e475cf2ac4330a4537879a00d88d5ada418..8628650ad5d7e6779c435f9eede951cf64a1fadb 100644 (file)
@@ -257,7 +257,7 @@ namespace System.Xml.Serialization {
                protected XmlQualifiedName GetXsiType ()
                {
                        string typeName = Reader.GetAttribute ("xsi:type");
-                       if (typeName == string.Empty) return null;
+                       if (typeName == string.Empty || typeName == null) return null;
                        int i = typeName.IndexOf (":");
                        if (i == -1) return new XmlQualifiedName (typeName, "");
                        else 
@@ -325,10 +325,8 @@ namespace System.Xml.Serialization {
 
                        reader.ReadStartElement();
                        while (reader.NodeType != XmlNodeType.EndElement)
-                       {
                                UnknownNode (null);
-                               reader.Read ();
-                       }
+
                        ReadEndElement ();
                        return true;
                }
@@ -566,8 +564,13 @@ namespace System.Xml.Serialization {
                protected void UnknownNode (object o)
                {
                        // TODO: line numbers
-                       if (Reader.NodeType == XmlNodeType.Element) Reader.Skip();
                        eventSource.OnUnknownNode (new XmlNodeEventArgs(0, 0, Reader.LocalName, Reader.Name, Reader.NamespaceURI, Reader.NodeType, o, Reader.Value));
+                       if (Reader.NodeType != XmlNodeType.Attribute)
+                       {
+                               Reader.Skip();
+                               if (Reader.ReadState == ReadState.EndOfFile) 
+                                       throw new InvalidOperationException ("End of document found");
+                       }
                }
 
                protected void UnreferencedObject (string id, object o)
index 277780c313ec0bdc0784a3695649583988e1759e..eaaf0ecc19aad6ea550c1a90ee085a963b0911af 100644 (file)
@@ -15,9 +15,9 @@ namespace System.Xml.Serialization
 {
        public class XmlSerializationReaderInterpreter: XmlSerializationReader
        {
-               XmlTypeMapping _typeMap;
+               XmlMapping _typeMap;
 
-               public XmlSerializationReaderInterpreter(XmlTypeMapping typeMap)
+               public XmlSerializationReaderInterpreter(XmlMapping typeMap)
                {
                        _typeMap = typeMap;
                }
@@ -33,7 +33,38 @@ namespace System.Xml.Serialization
                internal override object ReadObject ()
                {
                        Reader.MoveToContent();
-                       return ReadObject (_typeMap, true, true);
+                       if (_typeMap is XmlTypeMapping)
+                               return ReadObject ((XmlTypeMapping)_typeMap, true, true);
+                       else
+                               return ReadMessage ((XmlMembersMapping)_typeMap);
+               }
+
+               object ReadMessage (XmlMembersMapping typeMap)
+               {
+                       object[] parameters = new object[typeMap.Count];
+
+                       if (typeMap.HasWrapperElement)
+                       {
+                               while (Reader.NodeType != System.Xml.XmlNodeType.EndElement) 
+                               {
+                                       if (Reader.IsStartElement(typeMap.ElementName, typeMap.Namespace))  
+                                       {
+                                               if (Reader.IsEmptyElement) { Reader.Skip(); Reader.MoveToContent(); continue; }
+                                               Reader.ReadStartElement();
+                                               ReadMembers ((ClassMap)typeMap.ObjectMap, parameters, true);
+                                               ReadEndElement();
+                                               break;
+                                       }
+                                       else 
+                                               UnknownNode(null);
+
+                                       Reader.MoveToContent();
+                               }
+                       }
+                       else
+                               ReadMembers ((ClassMap)typeMap.ObjectMap, parameters, true);
+
+                       return parameters;
                }
 
                object ReadObject (XmlTypeMapping typeMap, bool isNullable, bool checkType)
@@ -71,50 +102,66 @@ namespace System.Xml.Serialization
             }
 
                        object ob = Activator.CreateInstance (typeMap.TypeData.Type);
-                       Type obType = typeMap.TypeData.Type;
-                       ClassMap map = (ClassMap) typeMap.ObjectMap;
 
-                       // Reads attributes
+                       Reader.MoveToElement();
+                       bool isEmpty = Reader.IsEmptyElement;
+                       ReadMembers ((ClassMap) typeMap.ObjectMap, ob, false);
 
-                       XmlTypeMapMember anyAttrMember = map.DefaultAnyAttributeMember;
-                       int anyAttributeIndex = 0;
-                       object anyAttributeArray = null;
+                       if (isEmpty) Reader.Skip();
+                       else ReadEndElement();
+
+                       return ob;
+               }
 
-                       while (Reader.MoveToNextAttribute())
+               void ReadMembers (ClassMap map, object ob, bool isValueList)
+               {
+                       // A value list cannot have attributes
+
+                       if (!isValueList)
                        {
-                               XmlTypeMapMemberAttribute member = map.GetAttribute (Reader.LocalName, Reader.NamespaceURI);
+                               // Reads attributes
+
+                               XmlTypeMapMember anyAttrMember = map.DefaultAnyAttributeMember;
+                               int anyAttributeIndex = 0;
+                               object anyAttributeArray = null;
 
-                               if (member != null) {
-                                       member.SetValue (ob, XmlCustomFormatter.FromXmlString (member.TypeData.Type, Reader.Value));
+                               while (Reader.MoveToNextAttribute())
+                               {
+                                       XmlTypeMapMemberAttribute member = map.GetAttribute (Reader.LocalName, Reader.NamespaceURI);
+
+                                       if (member != null) 
+                                       {
+                                               SetMemberValue (member, ob, XmlCustomFormatter.FromXmlString (member.TypeData.Type, Reader.Value), isValueList);
+                                       }
+                                       else if (IsXmlnsAttribute(Reader.Name)) 
+                                       {
+                                               // Ignore
+                                       }       
+                                       else if (anyAttrMember != null) 
+                                       {
+                                               AddListValue (anyAttrMember.TypeData.Type, ref anyAttributeArray, anyAttributeIndex++, Document.ReadNode(Reader), true);
+                                       }
+                                       else
+                                               UnknownNode(ob);
                                }
-                               else if (IsXmlnsAttribute(Reader.Name)) {
-                                       // Ignore
-                               }       
-                               else if (anyAttrMember != null) {
-                                       AddListValue (anyAttrMember.TypeData.Type, ref anyAttributeArray, anyAttributeIndex++, Document.ReadNode(Reader), true);
+
+                               if (anyAttrMember != null)
+                               {
+                                       anyAttributeArray = ShrinkArray ((Array)anyAttributeArray, anyAttributeIndex, anyAttrMember.TypeData.Type.GetElementType(), true);
+                                       SetMemberValue (anyAttrMember, ob, anyAttributeArray, isValueList);
                                }
-                               else
-                                       UnknownNode(ob);
-                       }
 
-                       if (anyAttrMember != null)
-                       {
-                               anyAttributeArray = ShrinkArray ((Array)anyAttributeArray, anyAttributeIndex, anyAttrMember.TypeData.Type.GetElementType(), true);
-                               anyAttrMember.SetValue (ob, anyAttributeArray);
+                               Reader.MoveToElement();
+                               if (Reader.IsEmptyElement) 
+                                       return;
+
+                               Reader.ReadStartElement();
                        }
 
                        // Reads elements
 
-                       Reader.MoveToElement();
-                       if (Reader.IsEmptyElement) 
-                       {
-                               Reader.Skip();
-                               return ob;
-                       }
-
                        bool[] readFlag = new bool[map.ElementMembers.Count];
 
-                       Reader.ReadStartElement();
                        Reader.MoveToContent();
 
                        int[] indexes = null;
@@ -125,7 +172,7 @@ namespace System.Xml.Serialization
                                indexes = new int[map.FlatLists.Count];
                                flatLists = new object[map.FlatLists.Count];
                                foreach (XmlTypeMapMemberExpandable mem in map.FlatLists)
-                                       if (mem.IsReadOnly (obType)) flatLists[mem.FlatArrayIndex] = mem.GetValue (ob);
+                                       if (IsReadOnly (mem, ob, isValueList)) flatLists[mem.FlatArrayIndex] = mem.GetValue (ob);
                        }
 
                        while (Reader.NodeType != System.Xml.XmlNodeType.EndElement) 
@@ -137,24 +184,24 @@ namespace System.Xml.Serialization
                                        {
                                                if (info.Member.GetType() == typeof (XmlTypeMapMemberList))
                                                {
-                                                       if (info.Member.IsReadOnly (obType)) ReadListElement (info.MappedType, info.IsNullable, info.Member.GetValue (ob), false);
-                                                       else info.Member.SetValue (ob, ReadListElement (info.MappedType, info.IsNullable, null, true));
+                                                       if (IsReadOnly (info.Member, ob, isValueList)) ReadListElement (info.MappedType, info.IsNullable, info.Member.GetValue (ob), false);
+                                                       else  SetMemberValue (info.Member, ob, ReadListElement (info.MappedType, info.IsNullable, null, true), isValueList);
                                                        readFlag[info.Member.Index] = true;
                                                }
                                                else if (info.Member.GetType() == typeof (XmlTypeMapMemberFlatList))
                                                {
                                                        XmlTypeMapMemberFlatList mem = (XmlTypeMapMemberFlatList)info.Member;
-                                                       AddListValue (mem.TypeData.Type, ref flatLists[mem.FlatArrayIndex], indexes[mem.FlatArrayIndex]++, ReadObjectElement (info), !info.Member.IsReadOnly (obType));
+                                                       AddListValue (mem.TypeData.Type, ref flatLists[mem.FlatArrayIndex], indexes[mem.FlatArrayIndex]++, ReadObjectElement (info), !IsReadOnly (info.Member, ob, isValueList));
                                                }
                                                else if (info.Member.GetType() == typeof (XmlTypeMapMemberAnyElement))
                                                {
                                                        XmlTypeMapMemberAnyElement mem = (XmlTypeMapMemberAnyElement)info.Member;
                                                        if (mem.TypeData.IsListType) AddListValue (mem.TypeData.Type, ref flatLists[mem.FlatArrayIndex], indexes[mem.FlatArrayIndex]++, ReadXmlNode (false), true);
-                                                       else mem.SetValue (ob, ReadXmlNode (false));
+                                                       else SetMemberValue (mem, ob, ReadXmlNode (false), isValueList);
                                                }
                                                else if (info.Member.GetType() == typeof(XmlTypeMapMemberElement))
                                                {
-                                                       info.Member.SetValue (ob, ReadObjectElement (info));
+                                                       SetMemberValue (info.Member, ob, ReadObjectElement (info), isValueList);
                                                        readFlag[info.Member.Index] = true;
                                                }
                                                else
@@ -164,7 +211,7 @@ namespace System.Xml.Serialization
                                        {
                                                XmlTypeMapMemberAnyElement mem = map.DefaultAnyElementMember;
                                                if (mem.TypeData.IsListType) AddListValue (mem.TypeData.Type, ref flatLists[mem.FlatArrayIndex], indexes[mem.FlatArrayIndex]++, ReadXmlNode (false), true);
-                                               else mem.SetValue (ob, ReadXmlNode (false));
+                                               else SetMemberValue (mem, ob, ReadXmlNode (false), isValueList);
                                        }
                                        else 
                                                UnknownNode(ob);
@@ -182,13 +229,22 @@ namespace System.Xml.Serialization
                                        Object list = flatLists[mem.FlatArrayIndex];
                                        if (mem.TypeData.Type.IsArray)
                                                list = ShrinkArray ((Array)list, indexes[mem.FlatArrayIndex], mem.TypeData.Type.GetElementType(), true);
-                                       if (!mem.IsReadOnly (obType))
-                                               mem.SetValue (ob, list);
+                                       if (!IsReadOnly (mem, ob, isValueList))
+                                               SetMemberValue (mem, ob, list, isValueList);
                                }
-                       }
+                       }               
+               }
 
-                       ReadEndElement();
-                       return ob;
+               bool IsReadOnly (XmlTypeMapMember member, object ob, bool isValueList)
+               {
+                       if (isValueList) return false;
+                       else return member.IsReadOnly (ob.GetType());
+               }
+
+               void SetMemberValue (XmlTypeMapMember member, object ob, object value, bool isValueList)
+               {
+                       if (isValueList) ((object[])ob)[member.Index] = value;
+                       else member.SetValue (ob, value);
                }
 
                object ReadObjectElement (XmlTypeMapElementInfo elem)
@@ -297,10 +353,10 @@ namespace System.Xml.Serialization
 
                object ReadEnumElement (XmlTypeMapping typeMap, bool isNullable)
                {
-                       Reader.ReadStartElement ();\r
-                       object o = GetEnumValue (typeMap, Reader.ReadString());\r
-                       Reader.ReadEndElement ();\r
-                       return o;\r
+                       Reader.ReadStartElement ();
+                       object o = GetEnumValue (typeMap, Reader.ReadString());
+                       Reader.ReadEndElement ();
+                       return o;
                }
 
                object GetEnumValue (XmlTypeMapping typeMap, string val)
index ea20bdbe9622401fd946d6c66a194ca42709f339..70cbb3c777d58e3248fcccdbf93e57594714c065 100644 (file)
@@ -522,7 +522,8 @@ namespace System.Xml.Serialization {
 
                protected void WriteStartDocument ()
                {
-                       Writer.WriteStartDocument ();
+                       if (Writer.WriteState == WriteState.Start)
+                               Writer.WriteStartDocument ();
                }
 
                protected void WriteStartElement (string name)
@@ -579,7 +580,7 @@ namespace System.Xml.Serialization {
                                TypeData td = TypeTranslator.GetTypeData (o.GetType ());
                                if (td.SchemaType != SchemaTypes.Primitive)
                                        throw new InvalidOperationException ("Invalid type: " + o.GetType().FullName);
-                               WriteXsiType (td.ElementName, XmlSchema.Namespace);
+                               WriteXsiType (td.XmlType, XmlSchema.Namespace);
                        }
 
                        WriteValue (value);
index dbf9d51cad5d0bc8bbf3932023195fb560d1bc92..fc5702fd7052b4638c1f38d38ac6dac920fb72c8 100644 (file)
@@ -15,9 +15,9 @@ namespace System.Xml.Serialization
 {
        internal class XmlSerializationWriterInterpreter: XmlSerializationWriter
        {
-               XmlTypeMapping _typeMap;
+               XmlMapping _typeMap;
 
-               public XmlSerializationWriterInterpreter(XmlTypeMapping typeMap)
+               public XmlSerializationWriterInterpreter(XmlMapping typeMap)
                {
                        _typeMap = typeMap;
                }
@@ -28,7 +28,17 @@ namespace System.Xml.Serialization
 
                internal override void WriteObject (object ob)
                {
-                       WriteObject (_typeMap, ob, _typeMap.ElementName, _typeMap.Namespace, true, false);
+                       WriteStartDocument ();
+
+                       if (_typeMap is XmlTypeMapping)
+                       {
+                               XmlTypeMapping mp = (XmlTypeMapping) _typeMap;
+                               WriteObject (mp, ob, mp.ElementName, mp.Namespace, true, false);
+                       }
+                       else if (ob is object[])
+                               WriteMessage ((XmlMembersMapping)_typeMap, (object[]) ob);
+                       else
+                               throw CreateUnknownTypeException (ob);
                }
 
                void WriteObject (XmlTypeMapping typeMap, object ob, string element, string namesp, bool isNullable, bool needType)
@@ -58,26 +68,50 @@ namespace System.Xml.Serialization
                        }
                }
 
+               void WriteMessage (XmlMembersMapping membersMap, object[] parameters)
+               {
+                       if (membersMap.HasWrapperElement) {
+                               WriteStartDocument();\r
+                               // TopLevelElement();\r
+                               WriteStartElement(membersMap.ElementName, membersMap.Namespace);\r
+                       }\r
+                       \r
+                       WriteMembers ((ClassMap)membersMap.ObjectMap, parameters, true);\r
+\r
+                       if (membersMap.HasWrapperElement)
+                               WriteEndElement();
+               }
+
                void WriteObjectElement (XmlTypeMapping typeMap, object ob, string element, string namesp, bool needType)
                {
                        WriteStartElement(element, namesp, ob);
                        if (needType) 
                                WriteXsiType(typeMap.XmlType, typeMap.Namespace);
 
+                       ClassMap map = (ClassMap)typeMap.ObjectMap;
+                       WriteMembers (map, ob, false);
+                       WriteEndElement (ob);
+               }
+
+               void WriteMembers (ClassMap map, object ob, bool isValueList)
+               {
                        // Write attributes
 
-                       ClassMap map = (ClassMap)typeMap.ObjectMap;
                        ICollection attributes = map.AttributeMembers;
                        if (attributes != null)
                        {
-                               foreach (XmlTypeMapMemberAttribute attr in attributes)
-                                       WriteAttribute(attr.AttributeName, attr.Namespace, XmlCustomFormatter.ToXmlString (attr.GetValue(ob)));
+                               foreach (XmlTypeMapMemberAttribute attr in attributes) {
+                                       if (MemberHasValue (attr, ob, isValueList))
+                                               WriteAttribute(attr.AttributeName, attr.Namespace, XmlCustomFormatter.ToXmlString (GetMemberValue (attr, ob, isValueList)));
+                               }
                        }
 
-                       if (map.DefaultAnyAttributeMember != null)
+                       XmlTypeMapMember anyAttrMember = map.DefaultAnyAttributeMember;
+                       if (anyAttrMember != null && MemberHasValue (anyAttrMember, ob, isValueList))
                        {
-                               ICollection extraAtts = (ICollection) map.DefaultAnyAttributeMember.GetValue (ob);
-                               if (extraAtts != null) {
+                               ICollection extraAtts = (ICollection) GetMemberValue (anyAttrMember, ob, isValueList);
+                               if (extraAtts != null) \r
+                               {
                                        foreach (XmlAttribute attr in extraAtts)
                                                WriteAttribute(attr.LocalName, attr.NamespaceURI, attr.Value);
                                }
@@ -90,8 +124,11 @@ namespace System.Xml.Serialization
                        {
                                foreach (XmlTypeMapMemberElement member in members)
                                {
-                                       object memberValue = member.GetValue (ob);
-                                       if (member.GetType() == typeof(XmlTypeMapMemberList))
+                                       if (!MemberHasValue (member, ob, isValueList)) continue;
+                                       object memberValue = GetMemberValue (member, ob, isValueList);
+                                       Type memType = member.GetType();
+
+                                       if (memType == typeof(XmlTypeMapMemberList))
                                        {
                                                if (memberValue != null) \r
                                                {
@@ -101,35 +138,46 @@ namespace System.Xml.Serialization
                                                        WriteEndElement (memberValue);
                                                }
                                        }
-                                       else if (member.GetType() == typeof(XmlTypeMapMemberFlatList))
+                                       else if (memType == typeof(XmlTypeMapMemberFlatList))
                                        {
                                                if (memberValue != null)
                                                        WriteListContent (member.TypeData, ((XmlTypeMapMemberFlatList)member).ListMap, memberValue);
                                        }
-                                       else if (member.GetType() == typeof(XmlTypeMapMemberAnyElement))
+                                       else if (memType == typeof(XmlTypeMapMemberAnyElement))
                                        {
                                                if (memberValue != null)
                                                        WriteAnyElementContent ((XmlTypeMapMemberAnyElement)member, memberValue);
                                        }
-                                       else if (member.GetType() == typeof(XmlTypeMapMemberAnyElement))
+                                       else if (memType == typeof(XmlTypeMapMemberAnyElement))
                                        {
                                                if (memberValue != null)
                                                        WriteAnyElementContent ((XmlTypeMapMemberAnyElement)member, memberValue);
                                        }
-                                       else if (member.GetType() == typeof(XmlTypeMapMemberAnyAttribute))
+                                       else if (memType == typeof(XmlTypeMapMemberAnyAttribute))
                                        {
                                                // Ignore
                                        }
-                                       else if (member.GetType() == typeof(XmlTypeMapMemberElement))
+                                       else if (memType == typeof(XmlTypeMapMemberElement))
                                        {
                                                XmlTypeMapElementInfo elem = member.FindElement (ob, memberValue);
                                                WriteMemberElement (elem, memberValue);
                                        }
                                        else
                                                throw new InvalidOperationException ("Unknown member type");
-                               }
-                       }
-                       WriteEndElement (ob);
+                               }\r
+                       }\r
+               }
+
+               object GetMemberValue (XmlTypeMapMember member, object ob, bool isValueList)
+               {
+                       if (isValueList) return ((object[])ob)[member.Index];
+                       else return member.GetValue (ob);
+               }
+
+               bool MemberHasValue (XmlTypeMapMember member, object ob, bool isValueList)
+               {
+                       if (isValueList) return member.Index < ((object[])ob).Length;
+                       else return true;
                }
 
                void WriteMemberElement (XmlTypeMapElementInfo elem, object memberValue)
index 0b3bef52addd7bc4506abe25b404f09651a28a6f..eb514916e0380228e239bb39ee0788898e0d38f9 100644 (file)
@@ -23,7 +23,7 @@ namespace System.Xml.Serialization
 
 #region Fields
 
-               XmlTypeMapping typeMapping;
+               XmlMapping typeMapping;
 
 #endregion // Fields
 
@@ -43,6 +43,11 @@ namespace System.Xml.Serialization
                        typeMapping = xmlTypeMapping;
                }
 
+               internal XmlSerializer (XmlMapping mapping)
+               {
+                       typeMapping = mapping;
+               }
+
                public XmlSerializer (Type type, string defaultNamespace)
                        : this (type, null, null, null, defaultNamespace)
                {
@@ -83,6 +88,7 @@ namespace System.Xml.Serialization
                        typeMapping = importer.ImportTypeMapping (type, root, defaultNamespace);
                }
 
+
 #endregion // Constructors
 
 #region Events
@@ -142,7 +148,10 @@ namespace System.Xml.Serialization
                public virtual bool CanDeserialize (XmlReader xmlReader)
                {
                        xmlReader.MoveToContent ();
-                       return typeMapping.ElementName == xmlReader.LocalName;
+                       if (typeMapping is XmlMembersMapping) 
+                               return true;
+                       else
+                               return ((XmlTypeMapping)typeMapping).ElementName == xmlReader.LocalName;
                }
 
                protected virtual XmlSerializationReader CreateReader ()
@@ -183,11 +192,7 @@ namespace System.Xml.Serialization
                {
                        XmlSerializer [] sers = new XmlSerializer [mappings.Length];
                        for (int n=0; n<mappings.Length; n++)
-                       {
-                               XmlTypeMapping map = mappings[n] as XmlTypeMapping;
-                               if (map == null) throw new NotSupportedException ("Unsupported mapping type");
-                               sers[n] = new XmlSerializer (map);
-                       }
+                               sers[n] = new XmlSerializer (mappings[n]);
                        return sers;
                }
 
@@ -240,11 +245,9 @@ namespace System.Xml.Serialization
 
                public void Serialize (XmlWriter writer, object o, XmlSerializerNamespaces namespaces)
                {
-                       writer.WriteStartDocument ();
                        XmlSerializationWriter xsWriter = CreateWriter ();
                        xsWriter.Initialize (writer);
                        Serialize (o, xsWriter);
-                       writer.WriteEndDocument();
                        writer.Flush ();
                }
 #endregion // Methods
index be1d679ddf30cbaa65e58b5bbc0f39e2de648e1c..7c8f677d49b90be8aebf1e9c3171069adb2a70ac 100644 (file)
@@ -20,7 +20,6 @@ namespace System.Xml.Serialization
                private string ns;\r
                private string xmlType;\r
                TypeData type;\r
-               ObjectMap map;\r
 \r
                ArrayList _derivedTypes = new ArrayList();\r
 \r
@@ -86,19 +85,8 @@ namespace System.Xml.Serialization
                                if (map.xmlType == name && map.ns == ens) return map;\r
                        return null;\r
                }\r
-\r
-               internal ObjectMap ObjectMap\r
-               {\r
-                       get { return map; }\r
-                       set { map = value; }\r
-               }\r
        }\r
 \r
-       internal class ObjectMap\r
-       {\r
-       }\r
-\r
-\r
        // Mapping info for classes and structs\r
 \r
        internal class ClassMap: ObjectMap\r