Сериализация данных с использованием IEnumerable<T> с WebGet

возможный дубликат:
Невозможно сериализовать параметр типа "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 ответа

Решение

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

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

Вам нужно вернуть массив.

РЕДАКТИРОВАТЬ: Самый простой способ сделать это, чтобы переместить ваш итератор в отдельный метод, и изменить WebMethod в

[WebGet]
MyClass[] WebMethod() { return OtherMethod().ToArray(); }

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

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

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

Другие вопросы по тегам