【问题标题】:WCF : [XmlElement, typeof] in DataMember attributeWCF:DataMember 属性中的 [XmlElement,typeof]
【发布时间】:2014-11-05 13:42:12
【问题描述】:

我想做类似的事情:

[XmlElement("Foo1", typeof(Foo1Type))]
[XmlElement("Foo2", typeof(Foo2Type))]
public object Foo { get; set; }

我想使用 WCF 的 DataContractSerializer 执行此操作。 Datamember 属性中的类似内容。

这相当于xsd:Choice

我的目标是根据标签的类型动态分配标签。

谢谢。

【问题讨论】:

    标签: c# .net xml wcf serialization


    【解决方案1】:

    根据以下 MSDN 链接,DataContractSerializer 不支持将 XSD 选项映射到 CLR 等效类型。

    choice  |  Forbidden
    

    禁止。 DataContractSerializer 不支持使用该功能导入架构。例如,Svcutil.exe 在访问具有使用此类功能的架构的 WSDL 时,会转而使用 XmlSerializer。这是默认设置。

    http://msdn.microsoft.com/en-us/library/ms733112(v=vs.110).aspx

    注意:您可以使用数据协定已知类型解决此问题。 http://msdn.microsoft.com/en-us/library/ms730167.aspx

    【讨论】:

    • 好的,但是这段代码不能更好地工作:[XmlElement("Foo1", typeof(Foo1Type))] [XmlElement("Foo2", typeof(Foo2Type))] [DataMember] public object Foo { get; set; } 如果它回退到 XmlSerializer,为什么我的序列化 XML 标记名称总是“Foo”而不是“Foo1”或“Foo2” ?
    【解决方案2】:

    我必须将 ServiceContract 更改如下:

    [ServiceContract(Name="ChoiceService", Namespace="http://dev.janus-net.de/example/choice")]
    [XmlSerializerFormat(Style = OperationFormatStyle.Document)]
    public interface IChoiceService
    

    并在DataContract中添加Serializable

    [DataContract(Namespace = "http://...", Name = "yourContract")]
    [Serializable]
    

    完整的例子在:http://www.janus-net.de/2007/08/07/using-xschoice-in-wcf-services/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 2021-01-09
      相关资源
      最近更新 更多