¿Puede alguien explicarme por qué este primer ejemplo se serializará en XML, y el segundo arrojará errores de tiempo de ejecución al tratar de convertir todos los tipos entre sí? Si elimino los atributos XmlElement
del segundo ejemplo, se serializará, pero el nombre del elemento XML será incorrecto ("Artículo" en lugar del especificado para ese tipo). El primer fragmento se generó a partir de la herramienta XSD utilizando el archivo de esquema.Serialización de propiedades genéricas
Mejor aún, ¿hay alguna manera de hacer que esto funcione? Preferiría usar tipos genéricos que emiten a/desde objetos. Hace un código mucho más limpio. Expulsar objetos explícitamente muestra que hay un problema en su diseño.
public partial class OAIPMHtype
{
private object itemsField;
[XmlElement("GetRecord", typeof(GetRecordType))]
[XmlElement("Identify", typeof(IdentifyType))]
[XmlElement("ListIdentifiers", typeof(ListIdentifiersType))]
[XmlElement("ListMetadataFormats", typeof(ListMetadataFormatsType))]
[XmlElement("ListRecords", typeof(ListRecordsType))]
[XmlElement("ListSets", typeof(ListSetsType))]
[XmlElement("error", typeof(OAIPMHerrorType))]
public object Item
{
get { return this.itemsField; }
set { this.itemsField = value; }
}
}
Esto no se serializará.
public class OaiPmh<T>
{
private T itemsField;
[XmlElement("GetRecord", typeof(GetRecordType))]
[XmlElement("Identify", typeof(IdentifyType))]
[XmlElement("ListIdentifiers", typeof(ListIdentifiersType))]
[XmlElement("ListMetadataFormats", typeof(ListMetadataFormatsType))]
[XmlElement("ListRecords", typeof(ListRecordsType))]
[XmlElement("ListSets", typeof(ListSetsType))]
[XmlElement("error", typeof(OAIPMHerrorType))]
public T Item
{
get { return itemsField; }
set { itemsField = value; }
}
}
Y para mayor aclaración, he tratado de especificar todos los tipos adicionales al crear el objeto XmlSerializer
, y eso no ayuda.
Esta es la excepción que ha arrojado:
Unable to generate a temporary class (result=1).
error CS0030: Cannot convert type 'ErrorRequest' to 'GetRecordRequest'
error CS0030: Cannot convert type 'ErrorRequest' to 'ListRecordsRequest'
error CS0030: Cannot convert type 'ErrorRequest' to 'IdentityRequest'
error CS0030: Cannot convert type 'ErrorRequest' to 'ListSetsRequest'
error CS0030: Cannot convert type 'ErrorRequest' to 'ListIdentifiersRequest'
error CS0030: Cannot convert type 'ErrorRequest' to 'ListMetadataFormatsRequest'
error CS0029: Cannot implicitly convert type 'ListSetsRequest' to 'ErrorRequest'
error CS0029: Cannot implicitly convert type 'ListIdentifiersRequest' to 'ErrorRequest'
error CS0029: Cannot implicitly convert type 'ListMetadataFormatsRequest' to 'ErrorRequest'
error CS0029: Cannot implicitly convert type 'GetRecordRequest' to 'ErrorRequest'
error CS0029: Cannot implicitly convert type 'ListRecordsRequest' to 'ErrorRequest'
error CS0029: Cannot implicitly convert type 'IdentityRequest' to 'ErrorRequest
'
En cierto modo tiene sentido con el tipo genérico, viendo cómo el tipo es consolidado específico en tiempo de compilación. Pero al ver cómo funciona con una referencia de objeto, en mi opinión, también debería funcionar con el tipo genérico.
¿Cuál es la excepción lanzada? –
Gracias, voy a editar. – MonkeyWrench
¿Qué es 'ErrorRequest'? –