2014-11-05 46 views
1

我想要做的事,如:WCF:[的XmlElement的typeof]在数据成员属性

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

我想用DataContractSerializer为WCF做到这一点。 类似于Datamember属性。

这相当于xsd:Choice

我打算根据其类型动态分配标签。

谢谢。

回答

2

根据以下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

+1

好,但是这段代码没有“[XmlElement(”Foo1“,typeof(Foo1Type))] [XmlElement(”Foo2“,typeof(Foo2Type))] [DataMember] public object Foo {get;组; }'如果它回退到XmlSerializer,为什么我的seriazlized XML标签名称总是“Foo”而不是“Foo1”或“Foo2”? – k4st0r42 2014-11-05 15:54:54

0

我不得不改变的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/