【发布时间】:2011-06-25 18:40:08
【问题描述】:
有人可以向我解释为什么第一个示例会序列化为 XML,而第二个示例会在尝试将所有类型相互转换时抛出运行时错误?如果我从第二个示例中删除 XmlElement 属性,它将序列化,但 XML 元素名称将是错误的(“Item”而不是为其类型指定的名称)。第一个 sn-p 是使用模式文件从 XSD 工具生成的。
更好的是,有没有办法让它工作?我更喜欢使用向/从对象转换的泛型类型。它使代码更清晰。显式转换对象表明您的设计存在问题。
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; }
}
}
这不会序列化。
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; }
}
}
为了进一步说明,我尝试在创建 XmlSerializer 对象时指定所有额外的类型,但这没有帮助。
这是抛出的异常:
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
'
泛型类型有点道理,看看在编译时类型是如何被特定的绑定的。但是看看它是如何与对象引用一起工作的,在我看来它也应该与泛型类型一起工作。
【问题讨论】:
-
它只是另一个包含一些 int/string 属性的类。没什么特别的。
-
更新:如果您在各个类之间添加隐式转换运算符,这将起作用。臀部疼痛,但会起作用。
标签: c# .net xml generics xml-serialization