【问题标题】:IEnumerable vs List in the Response Class,ServiceStack响应类中的IEnumerable vs List,ServiceStack
【发布时间】:2012-02-10 14:11:21
【问题描述】:

我不确定这是否是一个问题。

如果我在这里使用 List,它在 root/xml/metadata?op=Competitions 和 root/Competitions 中都有效

[DataContract]
public class CompetitionsResponse : IHasResponseStatus
{
    [DataMember]

    public List<Competitions> Competitions { get; set; }

    //Auto inject and serialize web service exceptions
    [DataMember]
    public ResponseStatus ResponseStatus { get; set; }
}

HTTP/1.1 200 正常 内容类型:应用程序/xml 内容长度:长度

<CompetitionsResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/FSI.API.ServiceModel">
  <Competitions>
    <Competitions>
      <CompName>String</CompName>
      <CompType>String</CompType>
      <CompetitionID>0</CompetitionID>
    </Competitions>
  </Competitions>
  <ResponseStatus xmlns:d2p1="http://schemas.servicestack.net/types">
    <d2p1:ErrorCode>String</d2p1:ErrorCode>
    <d2p1:Errors>
      <d2p1:ResponseError>
        <d2p1:ErrorCode>String</d2p1:ErrorCode>
        <d2p1:FieldName>String</d2p1:FieldName>
        <d2p1:Message>String</d2p1:Message>
      </d2p1:ResponseError>
    </d2p1:Errors>
    <d2p1:Message>String</d2p1:Message>
    <d2p1:StackTrace>String</d2p1:StackTrace>
  </ResponseStatus>
</CompetitionsResponse>

但如果我使用“IEnumerable”

[DataContract]
public class CompetitionsResponse : IHasResponseStatus
{
    [DataMember]
    public IEnumerable<Competitions> Competitions { get; set; }

    //Auto inject and serialize web service exceptions
    [DataMember]
    public ResponseStatus ResponseStatus { get; set; }
}

比赛集合从元页面中消失了 root/xml/metadata?op=竞赛

HTTP/1.1 200 OK

内容类型:应用程序/xml 内容长度:长度

<CompetitionsResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/FSI.API.ServiceModel">
  <Competitions i:nil="true" />
  <ResponseStatus xmlns:d2p1="http://schemas.servicestack.net/types">
    <d2p1:ErrorCode>String</d2p1:ErrorCode>
    <d2p1:Errors>
      <d2p1:ResponseError>
        <d2p1:ErrorCode>String</d2p1:ErrorCode>
        <d2p1:FieldName>String</d2p1:FieldName>
        <d2p1:Message>String</d2p1:Message>
      </d2p1:ResponseError>
    </d2p1:Errors>
    <d2p1:Message>String</d2p1:Message>
    <d2p1:StackTrace>String</d2p1:StackTrace>
  </ResponseStatus>
</CompetitionsResponse>

【问题讨论】:

    标签: c# servicestack


    【解决方案1】:

    ServiceStack 在底层使用 .NET 的 XML DataContractSerializer 进行 XML 序列化,这是您所看到的行为。它也适用于 POCO,即 [DataContract] 和 [DataMember] 属性是可选的。

    也不建议在 DTO 上使用接口(IMO 没有充分的理由),这些接口应该是类型化和自描述的。许多序列化程序不知道 IEnumerable 的具体类型应该是什么,因此必须做一些技巧,例如在有效负载中输出动态 typeinfo 元数据,或者假设默认集合类型。

    注意:如果您希望 XML 比您应该为您的 DTO 定义一个命名空间更漂亮 - 最好的方法是在您的 AssemblyInfo.cs 文件中定义一个程序集属性: p>

    [assembly: ContractNamespace("http://schemas.servicestack.net/types",  
        ClrNamespace = "FSI.API.ServiceModel")]
    

    【讨论】:

    • 我意识到这已经很老了,但仍然如此。 IEnumerable 不是您在序列化时要使用的一个接口吗?它将允许 yield 返回集合。当从数据库读取数据并流式传输到网络时,这可能是一个有用的优化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多