Я использую сервис REST, который всегда возвращает объект типа ServiceResult .Крутая вещь в WCF заключается в том, что десериализация xml выполняется автоматически.Ниже приведены два примера контрактов операций:
[ServiceContract]
[XmlSerializerFormat]
public interface IMyService
{
[OperationContract]
[WebGet(
BodyStyle = WebMessageBodyStyle.Bare,
ResponseFormat = WebMessageFormat.Xml,
UriTemplate = "authenticate?api={apiKey}&userName={userName}&password={password}")]
ServiceResult Authenticate(string apiKey, string userName, string password);
[OperationContract]
[WebGet(
BodyStyle = WebMessageBodyStyle.Bare,
ResponseFormat = WebMessageFormat.Xml,
UriTemplate = "getSchedules?api={apiKey}&user={userAccessCode}&states={states}&types={types}&filter={filter}")]
ServiceResult GetSchedules(string apiKey, string userAccessCode, string states, string types, string filter);
}
Объект ServiceResult содержит два элемента: Состояние простая строка и Результат , который является объектом (так может быть что угодно).Если я использую объект в качестве его типа, после десериализации я получаю список узлов XmlNode.Поэтому я создал абстрактный класс Result , который действует как суперкласс для всех ожидаемых типов:
[Serializable()]
[XmlRoot("ServiceResult", Namespace = "http://schemas.datacontract.org/2004/07/DTOModel.OpenApi")]
public class ServiceResult
{
[XmlElement("Result")]
public Result Result { get; set; }
[XmlElement("State")]
public string State { get; set; }
}
...
[XmlInclude(typeof(UserDto)), XmlInclude(typeof(ScheduleDto))]
[XmlType(Namespace = "http://schemas.datacontract.org/2004/07/DTOModel.Management")]
public abstract class Result
{
}
Это прекрасно работает, я могуприведите суперкласс к правильному подклассу после десериализации.Но вот моя проблема: результатом также может быть массив, и я не могу создать класс (используя CollectionDataContract ), который наследуется от Result и является массивом (или списком в этом отношении) ...
Есть решение или я все неправильно смотрю?
Спасибо