瀏覽代碼

2005-06-07 Lluis Sanchez Gual <[email protected]>

	* SerializationCodeGenerator.cs: When reading members by order,
	call a MoveToContext after each member read. In the fixup method
	don't cast returned values if it is reading an object array.
	
	* XmlSchemaImporter.cs: In ImportDerivedTypeMapping, if the type
	being imported is a primitive type, create a wrapper class that
	inherits from the provided one. This fixes bug #68809.
	
	* XmlSerializationReader.cs: Properly report unreferenced objects.
	Created an overload of ReadTypedPrimitive that reports elements of
	unknown type. Implemented Referenced(). 


svn path=/trunk/mcs/; revision=45586
Lluis Sanchez 20 年之前
父節點
當前提交
d8dc07c3f5

+ 14 - 0
mcs/class/System.XML/System.Xml.Serialization/ChangeLog

@@ -1,3 +1,17 @@
+2005-06-07  Lluis Sanchez Gual  <[email protected]>
+
+	* SerializationCodeGenerator.cs: When reading members by order,
+	call a MoveToContext after each member read. In the fixup method
+	don't cast returned values if it is reading an object array.
+	
+	* XmlSchemaImporter.cs: In ImportDerivedTypeMapping, if the type
+	being imported is a primitive type, create a wrapper class that
+	inherits from the provided one. This fixes bug #68809.
+	
+	* XmlSerializationReader.cs: Properly report unreferenced objects.
+	Created an overload of ReadTypedPrimitive that reports elements of
+	unknown type. Implemented Referenced(). 
+
 2005-05-30  Lluis Sanchez Gual  <[email protected]>
 
 	* XmlReflectionImporter.cs: Don't ignore type namespaces explicitely

+ 5 - 3
mcs/class/System.XML/System.Xml.Serialization/SerializationCodeGenerator.cs

@@ -1258,14 +1258,12 @@ namespace System.Xml.Serialization
 			if (_typeMap is XmlTypeMapping)
 			{
 				XmlTypeMapping typeMap = (XmlTypeMapping) _typeMap;
-//				Console.WriteLine ("> " + typeMap.TypeName);
 
 				if (_format == SerializationFormat.Literal)
 				{
 					if (typeMap.TypeData.SchemaType == SchemaTypes.XmlNode)
 						throw new Exception ("Not supported for XmlNode types");
 						
-//					Console.WriteLine ("This should be string:" + typeMap.ElementName.GetType());
 					WriteLineInd ("if (Reader.LocalName != " + GetLiteral (typeMap.ElementName) + " || Reader.NamespaceURI != " + GetLiteral (typeMap.Namespace) + ")");
 					WriteLine ("throw CreateUnknownNodeException();");
 					Unindent ();
@@ -1788,6 +1786,8 @@ namespace System.Xml.Serialization
 	
 					if (!readByOrder)
 						WriteLineUni ("}");
+					else
+						WriteLine ("Reader.MoveToContent();");
 					first = false;
 				}
 				
@@ -2256,7 +2256,9 @@ namespace System.Xml.Serialization
 					foreach (XmlTypeMapMember member in members)
 					{
 						WriteLineInd ("if (ids[" + member.Index + "] != null)");
-						GenerateSetMemberValue (member, "source", GetCast (member.TypeData, "GetTarget(ids[" + member.Index + "])"), isList);
+						string val = "GetTarget(ids[" + member.Index + "])";
+						if (!isList) val = GetCast (member.TypeData, val);
+						GenerateSetMemberValue (member, "source", val, isList);
 						Unindent ();
 					}
 				}

+ 13 - 6
mcs/class/System.XML/System.Xml.Serialization/XmlSchemaImporter.cs

@@ -196,10 +196,10 @@ namespace System.Xml.Serialization
 			}
 			else
 			{
-				if (!LocateElement (name, out qname, out stype) || stype == null)
-					return null;
+				if (!LocateElement (name, out qname, out stype))
+					return null;
 			}
-			
+
 			XmlTypeMapping map = GetRegisteredTypeMapping (qname);
 			if (map != null)
 			{
@@ -211,9 +211,16 @@ namespace System.Xml.Serialization
 				return map;
 			}
 			
-			map = CreateTypeMapping (qname, SchemaTypes.Class, name);
-			map.Documentation = GetDocumentation (stype);
-			RegisterMapFixup (map, qname, (XmlSchemaComplexType)stype);
+			map = CreateTypeMapping (qname, SchemaTypes.Class, name);
+			if (stype != null) {
+				map.Documentation = GetDocumentation (stype);
+				RegisterMapFixup (map, qname, (XmlSchemaComplexType)stype);
+			} else {
+				ClassMap cmap = new ClassMap ();
+				CodeIdentifiers classIds = new CodeIdentifiers ();
+				map.ObjectMap = cmap;
+				AddTextMember (qname, cmap, classIds);
+			}
 			
 			BuildPendingMaps ();
 			SetMapBaseType (map, baseType);

+ 42 - 15
mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReader.cs

@@ -59,6 +59,7 @@ namespace System.Xml.Serialization
 		Hashtable delayedListFixups;
 		XmlSerializer eventSource;
 		int delayedFixupId = 0;
+		Hashtable referencedObjects;
 
 		string w3SchemaNS;
 		string w3InstanceNS;
@@ -312,7 +313,12 @@ namespace System.Xml.Serialization
 		protected object GetTarget (string id)
 		{
 			if (targets == null) return null;
-			return targets [id];
+			object ob = targets [id];
+			if (ob != null) {
+				if (referencedObjects == null) referencedObjects = new Hashtable ();
+				referencedObjects [ob] = ob;
+			}
+			return ob;
 		}
 
 		bool TargetReady (string id)
@@ -496,14 +502,14 @@ namespace System.Xml.Serialization
 			{
 				WriteCallbackInfo info = GetCallbackInfo (qname);
 				if (info == null)
-					ob = ReadTypedPrimitive (qname);
+					ob = ReadTypedPrimitive (qname, id != null);
 				else
 					ob = info.Callback();
 			}
 			AddTarget (id, ob);
 			return ob;
 		}
-
+		
 		bool ReadList (out object resultList)
 		{
 			string arrayTypeAttr = Reader.GetAttribute (arrayType, soapNS);
@@ -598,6 +604,13 @@ namespace System.Xml.Serialization
 				foreach (Fixup fixup in fixups)
 					fixup.Callback (fixup);
 			}
+			
+			if (targets != null) {
+				foreach (DictionaryEntry e in targets) {
+					if (e.Value != null && (referencedObjects == null || !referencedObjects.Contains (e.Value)))
+						UnreferencedObject ((string)e.Key, e.Value);
+				}
+			}
 		}
 
 		protected object ReadReferencingElement (out string fixupReference)
@@ -644,7 +657,7 @@ namespace System.Xml.Serialization
 				{
 					WriteCallbackInfo info = GetCallbackInfo (qname);
 					if (info == null)
-						return ReadTypedPrimitive (qname);
+						return ReadTypedPrimitive (qname, true);
 					else
 						return info.Callback();
 				}
@@ -689,13 +702,22 @@ namespace System.Xml.Serialization
 		}
 
 		protected object ReadTypedPrimitive (XmlQualifiedName qname)
+		{
+			return ReadTypedPrimitive (qname, false);
+		}
+		
+		object ReadTypedPrimitive (XmlQualifiedName qname, bool reportUnknown)
 		{
 			if (qname == null) qname = GetXsiType ();
+			
 			TypeData typeData = TypeTranslator.FindPrimitiveTypeData (qname.Name);
 			if (typeData == null || typeData.SchemaType != SchemaTypes.Primitive)
 			{
 				// Put everything into a node array
 				XmlNode node = Document.ReadNode (reader);
+				
+				if (reportUnknown)
+					OnUnknownNode (node, null);
 
 				if (node.ChildNodes.Count == 0 && node.Attributes.Count == 0)
 					return new Object ();
@@ -743,9 +765,12 @@ namespace System.Xml.Serialization
 			return doc;
 		}
 
-		[MonoTODO ("Implement")]
 		protected void Referenced (object o)
 		{
+			if (o != null) {
+				if (referencedObjects == null) referencedObjects = new Hashtable ();
+				referencedObjects [o] = o;
+			}
 		}
 
 		protected Array ShrinkArray (Array a, int length, Type elementType, bool isNullable)
@@ -881,6 +906,11 @@ namespace System.Xml.Serialization
 		}
 
 		protected void UnknownNode (object o)
+		{
+			OnUnknownNode (ReadXmlNode (false), o);
+		}
+		
+		void OnUnknownNode (XmlNode node, object o)
 		{
 			int line_number, line_position;
 			
@@ -892,24 +922,21 @@ namespace System.Xml.Serialization
 				line_position = 0;
 			}
 	
-			if (eventSource != null)
-				eventSource.OnUnknownNode (new XmlNodeEventArgs(line_number, line_position, Reader.LocalName, Reader.Name, Reader.NamespaceURI, Reader.NodeType, o, Reader.Value));
-	
-			if (Reader.NodeType == XmlNodeType.Attribute)
+			if (node is XmlAttribute)
 			{
-				XmlAttribute att = (XmlAttribute) ReadXmlNode (false);
-				UnknownAttribute (o, att);
+				UnknownAttribute (o, (XmlAttribute)node);
 				return;
 			}
-			else if (Reader.NodeType == XmlNodeType.Element)
+			else if (node is XmlElement)
 			{
-				XmlElement elem = (XmlElement) ReadXmlNode (false);
-				UnknownElement (o, elem);
+				UnknownElement (o, (XmlElement) node);
 				return;
 			}
 			else
 			{
-				Reader.Skip();
+				if (eventSource != null)
+					eventSource.OnUnknownNode (new XmlNodeEventArgs(line_number, line_position, node.LocalName, node.Name, node.NamespaceURI, node.NodeType, o, node.Value));
+	
 				if (Reader.ReadState == ReadState.EndOfFile) 
 					throw new InvalidOperationException ("End of document found");
 			}