【问题标题】:Custom Array Item Name for DTODTO 的自定义数组项名称
【发布时间】:2012-05-20 13:37:53
【问题描述】:

我的一个客户有他想要发送到我们正在创建的服务的 XML 数据。示例消息可能如下所示:

<SomeRootElement>
  <Dates>
    <Date>2012-05-20T00:00:00</Date>
    <Date>2012-05-21T00:00:00</Date>
  </Dates>
</SomeRootElement>

在我的 WCF 服务应用程序中,我有一个对应的类型定义为 DataContract

[DataContract]
public class SomeRootElement {
    [DataMember]
    public ICollection<DateTime> Dates { get; set; }
}

问题在于,根据这个定义,WCF 希望Dates 集合看起来像:

<Dates>
  <dateTime>2012-05-20T00:00:00</dateTime>
  <dateTime>2012-05-21T00:00:00</dateTime>
</Dates>

有没有办法影响数组项的序列化元素名称?这曾经很容易使用 XML 序列化属性,但 DataContractSerializer 忽略了这些。

【问题讨论】:

  • 您可以将 [XmlSerializerFormat] 属性添加到该类中,以便使用 Xml 序列化属性

标签: c# xml wcf xml-serialization datacontractserializer


【解决方案1】:

这应该可以解决问题:

[DataContract]
[KnownType(typeof(DateList))]
public class SomeRootElement {
    [DataMember]
    public ICollection<DateTime> Dates { get; set; }
}

[CollectionDataContract(ItemName="date")]
public class DateList : Collection<DateTime>  {}

您正在覆盖它可用于反序列化 ICollection 的类型。

【讨论】:

  • 这似乎应该有效,但事实并非如此。 WSDL 包含&lt;xs:element xmlns:q1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" minOccurs="0" name="Dates" nillable="true" type="q1:ArrayOfdateTime"/&gt; 的一行。它没有提到数组项名称为date
  • 看来你正在做类似element.Dates = new Date[...] 的事情。改用element.Dates = new DateList();
猜你喜欢
  • 2021-02-03
  • 1970-01-01
  • 2022-01-20
  • 2022-11-28
  • 2017-11-05
  • 2020-07-10
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多