2014-11-05 3 views
1

Я хочу сделать что-то вроде:WCF: [XmlElement, TypeOf] в DataMember приписывать

[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

Ok , но этот код не лучше работать: '[XmlElement (« Foo1 », typeof (Foo1Type))] [XmlElement (« Foo2 », typeof (Foo2Type))] [DataMember] общественный объект Foo {get; задавать; } 'Если вместо этого он возвращается к XmlSerializer, почему мое имя тегаризованного XML-тега всегда« Foo », а не« Foo1 »или« Foo2 »? – k4st0r42

0

мне пришлось изменить ServiceContract следующим образом:

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

И добавить Сериализуемый в DataContract:

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

В COMPLET пример в: http://www.janus-net.de/2007/08/07/using-xschoice-in-wcf-services/

Смежные вопросы