gpt4 book ai didi

c# - 通用属性的序列化

转载 作者:数据小太阳 更新时间:2023-10-29 01:43:41 24 4
gpt4 key购买 nike

有人可以向我解释为什么第一个示例将序列化为 XML,而第二个示例将抛出有关尝试将所有类型相互转换的运行时错误吗?如果我从第二个示例中删除 XmlElement 属性,它将序列化,但 XML 元素名称将是错误的(“Item”而不是为其类型指定的名称)。第一个片段是使用架构文件从 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

'

它对泛型类型有意义,看看该类型在编译时是如何特定绑定(bind)的。但是看到它如何与对象引用一起工作,在我看来它也应该与泛型类型一起工作。

最佳答案

我认为 CS0029 compiler error page on MSDN提供您正在寻找的信息。

根据我阅读这篇文章的方式,您的第一个示例有效,因为您的类(class)中没有发生任何转换。因为您明确地传递了一个 Object ,所以不需要进行任何转换,也不会抛出编译器错误。

在第二个示例中,直到运行时才知道类型。通过指定多个 XmlElement 属性,编译器认为所有这些类型都必须可以互换。但是,由于您没有为这些类型提供显式转换,编译器担心这两种类型之间的转换可能是缩小转换并引发错误。

关于c# - 通用属性的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4973098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com