Просмотр исходного кода

* XmlReflectionImporter.cs: Reset internal tables for each ImportMembersMapping call.
* XmlSerializationReader.cs: GetXsiType(): use current reader.namespaceUri if namespace
is not specified in the xsi attribute.
* XmlSerializationReaderInterpreter.cs: Fixed bug when reading an empty array from an empty element.
* XmlSerializationWriterInterpreter.cs: Added null value check when writting an array.

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

Lluis Sanchez 22 лет назад
Родитель
Сommit
f213541b82

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

@@ -1,3 +1,11 @@
+2003-06-17  Lluis Sanchez Gual <[email protected]>
+
+	* XmlReflectionImporter.cs: Reset internal tables for each ImportMembersMapping call.
+	* XmlSerializationReader.cs: GetXsiType(): use current reader.namespaceUri if namespace
+	  is not specified in the xsi attribute.
+	* XmlSerializationReaderInterpreter.cs: Fixed bug when reading an empty array from an empty element.
+	* XmlSerializationWriterInterpreter.cs: Added null value check when writting an array.
+	
 2003-06-16  Atsushi Enomoto <[email protected]>
 
 	* XmlSerializationReader.cs : Synchronous fix with 

+ 7 - 2
mcs/class/System.XML/System.Xml.Serialization/XmlReflectionImporter.cs

@@ -19,8 +19,6 @@ namespace System.Xml.Serialization {
 		string initialDefaultNamespace;
 		XmlAttributeOverrides attributeOverrides;
 		ArrayList includedTypes;
-		Hashtable clrTypes = new Hashtable ();
-		Hashtable schemaTypes = new Hashtable ();
 		ReflectionHelper helper = new ReflectionHelper();
 		int arrayChoiceCount = 1;
 
@@ -54,6 +52,12 @@ namespace System.Xml.Serialization {
 				this.attributeOverrides = attributeOverrides;
 		}
 
+		void Reset ()
+		{
+			helper = new ReflectionHelper();
+			arrayChoiceCount = 1;
+		}
+
 		#endregion // Constructors
 
 		#region Methods
@@ -63,6 +67,7 @@ namespace System.Xml.Serialization {
 			XmlReflectionMember [] members,
 			bool hasWrapperElement)
 		{
+			Reset ();
 			XmlMemberMapping[] mapping = new XmlMemberMapping[members.Length];
 			for (int n=0; n<members.Length; n++)
 			{

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

@@ -281,7 +281,7 @@ namespace System.Xml.Serialization {
 			string typeName = Reader.GetAttribute ("xsi:type");
 			if (typeName == string.Empty || typeName == null) return null;
 			int i = typeName.IndexOf (":");
-			if (i == -1) return new XmlQualifiedName (typeName, "");
+			if (i == -1) return new XmlQualifiedName (typeName, Reader.NamespaceURI);
 			else 
 			{
 				string prefix = typeName.Substring(0,i);

+ 4 - 2
mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs

@@ -435,10 +435,12 @@ nss.Add (Reader.LocalName, Reader.Value);
 			if (list == null) {
 				if (canCreateInstance) list = CreateList (listType);
 				else throw CreateReadOnlyCollectionException (typeMap.TypeFullName);
-			}	
+			}
 
 			if (Reader.IsEmptyElement) {
 				Reader.Skip();
+				if (listType.IsArray)
+					list = ShrinkArray ((Array)list, 0, listType.GetElementType(), isNullable);
 				return list;
 			}
 
@@ -453,7 +455,7 @@ nss.Add (Reader.LocalName, Reader.Value);
 					XmlTypeMapElementInfo elemInfo = listMap.FindElement (Reader.LocalName, Reader.NamespaceURI);
 					if (elemInfo != null)
 						AddListValue (listType, ref list, index++, ReadObjectElement (elemInfo), false);
-					else 
+					else
 						UnknownNode(null);
 				}
 				else 

+ 5 - 1
mcs/class/System.XML/System.Xml.Serialization/XmlSerializationWriterInterpreter.cs

@@ -249,7 +249,11 @@ namespace System.Xml.Serialization
 					break;
 
 				case SchemaTypes.Array:
-					if (elem.MappedType.MultiReferenceType) 
+					if (memberValue == null) {
+						if (_format == SerializationFormat.Literal) WriteNullTagLiteral (elem.ElementName, elem.Namespace);
+						else WriteNullTagEncoded (elem.ElementName, elem.Namespace);
+					}
+					else if (elem.MappedType.MultiReferenceType) 
 						WriteReferencingElement (elem.ElementName, elem.Namespace, memberValue, elem.IsNullable);
 					else {
 						WriteStartElement(elem.ElementName, elem.Namespace, memberValue);