Ich weiß, dies ist eine ältere Frage, aber für zukünftige Leser hier ist das, was ich entdeckt:
Objekte, die IXmlSerializable
Bedarf implementieren ein Schema definiert, um zu haben, um sie mit der WSDL-Datei zu arbeiten, da sonst die .Net Framework weiß nicht, wie der Vertrag definiert wird, da die Serialisierung benutzerdefiniert ist.
Verwenden Sie das XmlSchemaProvider
-Attribut (msdn link), um das Schema anzugeben, das Sie die GetSchema-Methode in der IXmlSerializable-Schnittstelle nicht verwenden sollen. Sie können mehr in Microsofts Artikel Enrich Your XML Serialization With Schema Providers In The .NET Framework im Schema Provider Abschnitt lesen.
Sie finden Beispiele auf der XmlSchemaProvider-Attributseite und dem Artikel. Ich empfehle, Ihre Schemas in XSD-Dateien zu speichern und sie wie in den Beispielen zu lesen. Das Schreiben des Schemas durch Code ist bestenfalls beschwerlich.
Sobald ich den Schema-Provider implementiert hatte, funktionierte die Serialisierung wie erwartet. Wenn Ihr WCF-Dienst IIS-Gehostet ist, lesen Sie diese Frage zum richtigen IIS-Verzeichnis mithilfe der Reflektion Can I use reflection to find the bin/[Configuration] folder in ASP.NET instead of the asp temporary folder.
Beispiel aus dem Microsoft-Artikel:
[XmlRoot(ElementName="product_root", DataType="product_type",
Namespace="http://SchemaProvider.Example.org/Product.xsd",
IsNullable = false)]
[XmlSchemaProviderAttribute("GetSchemaFile")]
public class Product : IXmlSerializable
{
public static XmlSchemaComplexType GetSchemaFile(
System.Xml.Schema.XmlSchemaSet xs)
{
string xsdFile = Directory.GetCurrentDirectory() +
"\\Product.xsd";
XmlSerializer schemaSerializer =
new XmlSerializer(typeof(XmlSchema));
XmlSchema schema =
(XmlSchema)schemaSerializer.Deserialize(
XmlReader.Create(xsdFile));
xs.Add(schema);
// target namespace
string tns = "http://SchemaProvider.Example.org/Product.xsd";
XmlQualifiedName name =
new XmlQualifiedName("product_type", tns);
XmlSchemaComplexType productType =
(XmlSchemaComplexType) schema.SchemaTypes[name];
return productType;
}
...
}