Как я могу передать список <Interface>через WCF? - PullRequest
5 голосов
/ 03 августа 2009

У меня есть служба WCF, в которой я пытаюсь вернуть список (где IWatchable - это пользовательский интерфейс, который я создал) в одном из моих контрактов на эксплуатацию. Когда я тестирую сервис на клиенте, метод возвращает object[] вместо List<IWatchable>. Можно ли вернуть список IWatchable, поскольку IWatchable - это интерфейс с WCF?

Метод:

public List<IWatchable> GetWorkload( Guid nodeId, int maximum )

IWatchable:

public interface IWatchable
{
    string ActionName { get; set; }
    Guid ActionReference { get; set; }
}

Надеюсь, немного больше информации будет полезно ...

У меня есть производный интерфейс:

public interface IAMRAWatchable: IWatchable

И три конкретных варианта реализации от IAMRAWatchable:

public class InstrumentationWatch: IAMRAWatchable
public class OutputWatch: IAMRAWatchable
etc...

В моем методе WCF, который возвращает List<IWatchable> Я хочу отправить InstrumentationWatch и OutputWatch клиенту ... Это возможно или я поступаю неправильно?


Решено

Благодаря Джону я нашел свое решение. KnownType не работал, так как я использовал List<IWatchable> - поэтому я обернул свой список в новый класс и добавил к нему атрибуты. Мне нужно пересмотреть мой код, но для других, кто интересуется здесь, есть класс:

[DataContract]
[KnownType( typeof( InstrumentationWatch ) )]
[KnownType( typeof( OutputWatch ) )]
public class WorkInfo
{
    [DataMember]
    public List<IWatchable> WorkQueue { get; set; }
}

и мой метод WCF:

public WorkInfo GetWorkload( Guid nodeId, int maximum )

1 Ответ

9 голосов
/ 03 августа 2009

Интерфейс никогда не может быть сериализован. Это всего лишь описание поведения.

Вы можете сериализовать объекты, которые реализуют интерфейс, но вы должны сообщить WCF, каковы их типы. См. Известные типы контрактов данных .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...