diff options
author | Atsushi Eno <atsushieno@gmail.com> | 2007-09-25 19:55:48 +0400 |
---|---|---|
committer | Atsushi Eno <atsushieno@gmail.com> | 2007-09-25 19:55:48 +0400 |
commit | 1e597c4439f7a46c826e2339b6b7953782c5d7ff (patch) | |
tree | 74be09fa375561bce957608ec0a4e740a5df6ff8 /mcs/class/System.XML/System.Xml.Serialization | |
parent | f6ac366e8665e0aa05566570a545fcdaf8625d6c (diff) |
2007-09-25 Atsushi Enomoto <atsushi@ximian.com>
* XmlTypeMapping.cs, XmlSerializationWriterInterpreter.cs,
SerializationCodeGenerator.cs :
More XmlSchemaProviderAttribute method check. Use QName returned
by the method for the output root name.
* XmlSerializerTests.cs, XmlReflectionImporterTests.cs :
added tests for XmlSchemaProviderAttribute and how its qname works.
svn path=/trunk/mcs/; revision=86340
Diffstat (limited to 'mcs/class/System.XML/System.Xml.Serialization')
4 files changed, 20 insertions, 4 deletions
diff --git a/mcs/class/System.XML/System.Xml.Serialization/ChangeLog b/mcs/class/System.XML/System.Xml.Serialization/ChangeLog index 3378dfbdf53..f4f1d7fb87f 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/ChangeLog +++ b/mcs/class/System.XML/System.Xml.Serialization/ChangeLog @@ -1,3 +1,10 @@ +2007-09-25 Atsushi Enomoto <atsushi@ximian.com> + + * XmlTypeMapping.cs, XmlSerializationWriterInterpreter.cs, + SerializationCodeGenerator.cs : + More XmlSchemaProviderAttribute method check. Use QName returned + by the method for the output root name. + 2007-08-21 Atsushi Enomoto <atsushi@ximian.com> * XmlReflectionImporter.cs : do not reject XmlArrayAttribute on diff --git a/mcs/class/System.XML/System.Xml.Serialization/SerializationCodeGenerator.cs b/mcs/class/System.XML/System.Xml.Serialization/SerializationCodeGenerator.cs index b7b154f57e4..40b577324d9 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/SerializationCodeGenerator.cs +++ b/mcs/class/System.XML/System.Xml.Serialization/SerializationCodeGenerator.cs @@ -666,7 +666,9 @@ namespace System.Xml.Serialization if (typeMap.TypeData.SchemaType == SchemaTypes.XmlSerializable) { - WriteLine ("WriteSerializable (ob, element, namesp, isNullable);"); + WriteLine (String.Format ("WriteSerializable (ob, {0}, {1}, isNullable);", + typeMap.XmlType != null ? GetLiteral (typeMap.XmlType) : "element", + typeMap.XmlTypeNamespace != null ? GetLiteral (typeMap.XmlTypeNamespace) : "namesp")); GenerateEndHook (); WriteLineUni ("}"); @@ -2135,7 +2137,7 @@ namespace System.Xml.Serialization return GetReadObjectCall (elem.MappedType, GetLiteral(elem.IsNullable), "true"); case SchemaTypes.XmlSerializable: - return GetCast (elem.TypeData, String.Format ("ReadSerializable (({0}) Activator.CreateInstance(typeof({0}), true))", elem.TypeData.CSharpFullName)); + return GetCast (elem.TypeData, String.Format ("({0}) ReadSerializable (({0}) Activator.CreateInstance(typeof({0}), true))", elem.TypeData.CSharpFullName)); default: throw new NotSupportedException ("Invalid value type"); @@ -2431,7 +2433,7 @@ namespace System.Xml.Serialization WriteLine ("if (Reader.NodeType == XmlNodeType.Element)"); WriteLineInd ("{"); WriteLine ("if (Reader.LocalName == " + GetLiteral (typeMap.ElementName) + " && Reader.NamespaceURI == " + GetLiteral (typeMap.Namespace) + ")"); - WriteLine (String.Format ("\treturn ReadSerializable (({0}) Activator.CreateInstance(typeof({0}), true));", typeMap.TypeData.CSharpFullName)); + WriteLine (String.Format ("\treturn ({0}) ReadSerializable (({0}) Activator.CreateInstance(typeof({0}), true));", typeMap.TypeData.CSharpFullName)); WriteLine ("else"); WriteLine ("\tthrow CreateUnknownNodeException ();"); WriteLineUni ("}"); diff --git a/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationWriterInterpreter.cs b/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationWriterInterpreter.cs index bcb918281a5..29f7a61a53e 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationWriterInterpreter.cs +++ b/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationWriterInterpreter.cs @@ -116,7 +116,7 @@ namespace System.Xml.Serialization if (typeMap.TypeData.SchemaType == SchemaTypes.XmlSerializable) { - WriteSerializable ((IXmlSerializable)ob, element, namesp, isNullable); + WriteSerializable ((IXmlSerializable)ob, typeMap.XmlType ?? element, typeMap.XmlTypeNamespace ?? namesp, isNullable); return; } diff --git a/mcs/class/System.XML/System.Xml.Serialization/XmlTypeMapping.cs b/mcs/class/System.XML/System.Xml.Serialization/XmlTypeMapping.cs index ef45eca4f55..bbf222f03de 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/XmlTypeMapping.cs +++ b/mcs/class/System.XML/System.Xml.Serialization/XmlTypeMapping.cs @@ -205,6 +205,13 @@ namespace System.Xml.Serialization if (schemaProvider != null) { string method = schemaProvider.MethodName; MethodInfo mi = typeData.Type.GetMethod (method, BindingFlags.Static | BindingFlags.Public); + if (mi == null) + throw new InvalidOperationException (String.Format ("Type '{0}' must implement public static method '{1}'", typeData.Type, method)); + if (!typeof (XmlQualifiedName).IsAssignableFrom (mi.ReturnType) && + // LAMESPEC: it is undocumented. (We don't have to tell users about it in the error message.) + // Also do not add such a silly compatibility test to assert that it does not raise an error. + !typeof (XmlSchemaComplexType).IsAssignableFrom (mi.ReturnType)) + throw new InvalidOperationException (String.Format ("Method '{0}' indicated by XmlSchemaProviderAttribute must have its return type as XmlQualifiedName", method)); XmlSchemaSet xs = new XmlSchemaSet (); object retVal = mi.Invoke (null, new object [] { xs }); _schemaTypeName = XmlQualifiedName.Empty; |