WCF: [XmlElement, typeof] в атрибуте DataMember

1

Я хочу сделать что-то вроде:

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

Я хочу сделать это с помощью DataContractSerializer для WCF. Что-то подобное в Datamember.

Это эквивалент xsd:Choice.

Я хочу назначить динамические теги в соответствии с их типами.

Спасибо.

Теги:
serialization
wcf

2 ответа

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; set; } Если вместо этого он возвращается к XmlSerializer, почему мой сериализированный имя тега XML всегда "Foo", а не "Foo1" или "Foo2"?
0

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

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

И добавьте Serializable в DataContract:

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

Пример завершен: http://www.janus-net.de/2007/08/07/using-xschoice-in-wcf-services/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню