Сериализация данных с использованием IEnumerable<T> с WebGet
возможный дубликат:
Невозможно сериализовать параметр типа "System.Linq.Enumerable…" при использовании WCF, LINQ, JSON.
Привет,
Если моя подпись метода выглядит следующим образом, она работает нормально.
[WebGet]
MyClass[] WebMethod()
Если подпись выглядит так
[WebGet]
IEnumerable<T> WebMethod()
Я получаю следующую ошибку: Невозможно сериализовать параметр типа 'XYZT +
Я попытался добавить. ServiceKnownType(TypeOf(IEnumerable))
Та же ошибка
Это ошибка в бета-версии 2010, или это будет правильным в будущем?
Спасибо
2 ответа
Типы итераторов, генерируемые компилятором C#, не сериализуемы и никогда не будут.
Если вы прочтете эту страницу, вы увидите, что бессмысленно сериализовать итератор.
Вам нужно вернуть массив.
РЕДАКТИРОВАТЬ: Самый простой способ сделать это, чтобы переместить ваш итератор в отдельный метод, и изменить WebMethod
в
[WebGet]
MyClass[] WebMethod() { return OtherMethod().ToArray(); }
Я столкнулся с той же проблемой, и в моем случае просто невозможно изменить весь мой граф объектов с IEnumerable на основе итераторов на конкретные типы. Я просто не могу позволить себе преобразовать память в конкретные типы, такие как List или Array. Кроме того, что касается случая, когда я возвращаю IEnumerable некоторого объекта, который имеет свойство IEnumerable. Недопустимо, чтобы мне пришлось пересматривать весь мой объектный граф, преобразовывая все IEnumerables.
Я не вижу веской причины, по которой DataContractSerializer не может выполнить итерацию любого типа IEnumerable и визуализировать его элементы в XML так же, как и любой другой тип коллекции, даже если IEnumerable не имеет конкретного вспомогательного типа.
Это ошибка, которая должна быть исправлена.