Comprendo que esto es una cuestión mayor, pero para los futuros lectores aquí es lo que he descubierto:
objetos que implementan IXmlSerializable
necesidad de tener un esquema definido con el fin de que puedan trabajar con el WSDL, de lo contrario el .Net framework no sabe cómo definir el contrato porque la serialización es personalizada.
Para especificar el esquema, se supone que no debe utilizar el método GetSchema en la interfaz IXmlSerializable, más bien use el atributo XmlSchemaProvider
(msdn link). Puede leer más sobre en el artículo de Microsoft Enrich Your XML Serialization With Schema Providers In The .NET Framework en la sección proveedores de esquemas.
Puede encontrar ejemplos tanto en la página de atributos XmlSchemaProvider como en el artículo; le recomiendo almacenar sus esquemas en archivos .xsd y leerlos como en los ejemplos. Escribir el esquema a través del código es engorroso en el mejor de los casos.
Una vez que implementé el proveedor de esquemas, la serialización funcionó como se esperaba. Si su servicio WCF está alojado en IIS, consulte esta pregunta sobre cómo obtener el directorio IIS correcto a través del reflejo Can I use reflection to find the bin/[Configuration] folder in ASP.NET instead of the asp temporary folder.
ejemplo del artículo de Microsoft:
[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;
}
...
}