Сериализация данных с использованием IEnumerable <T>с WebGet - PullRequest
3 голосов
/ 20 января 2010

возможный дубликат:
Невозможно сериализовать параметр типа «System.Linq.Enumerable…» при использовании WCF, LINQ, JSON


Привет

Если подпись моего метода выглядит следующим образом, она работает нормально.

[WebGet]
MyClass[] WebMethod()

Если подпись выглядит так

[WebGet]
IEnumerable<T> WebMethod()

Я получаю следующую ошибку: Невозможно сериализовать параметр типа 'XYZT + d__2c' (для операции 'WebMethod', контракт 'IService'), поскольку это не точный тип 'System.Collections.Generic.IEnumerable`1 [XYZT]' в сигнатуре метода и отсутствует в коллекции известных типов. Для сериализации параметра добавьте тип в коллекцию известных типов для операции, используя ServiceKnownTypeAttribute.

Я попытался добавить. ServiceKnownType (TypeOf (IEnumerable))

Та же ошибка.

Это ошибка в бета-версии 2010 года, или это будет правильным в будущем?

Спасибо

Ответы [ 2 ]

7 голосов
/ 20 января 2010

Типы итераторов, генерируемые компилятором C #, не сериализуемы и никогда не будут.

Если вы прочитаете эту страницу , вы увидите, что бессмысленно сериализовать итератор.

Вам необходимо вернуть массив.

EDIT : Самый простой способ сделать это - переместить ваш итератор в отдельный метод и изменить WebMethod на

[WebGet]
MyClass[] WebMethod() { return OtherMethod().ToArray(); }
1 голос
/ 27 апреля 2010

Я столкнулся с той же проблемой, и в моем случае просто невозможно изменить весь мой объектный граф с IEnumerable на основе итераторов на конкретные типы. Я просто не могу позволить себе преобразовать память в конкретные типы, такие как List или Array. Кроме того, что касается случая, когда я возвращаю IEnumerable некоторого объекта, который имеет свойство IEnumerable. Недопустимо, чтобы мне пришлось пересматривать весь мой объектный граф, преобразовывая все IEnumerables.

Я не вижу веской причины, по которой DataContractSerializer не может выполнить итерацию любого типа IEnumerable и отобразить его элементы в XML так же, как и любой другой тип коллекции, даже если IEnumerable не имеет конкретного вспомогательного типа.

Это ошибка, которая должна быть исправлена.

...