Проблема сериализации WCF IList

Мне нравится синтаксис анонимного класса; это - просто меньше кода. Однако один главный довод "против", который я нашел, - то, что Вы не сможете сериализировать тот объект через дистанционную работу. Вы получите исключение о неспособности найти анонимный класс на удаленной стороне.

6
задан Nick 18 August 2009 в 15:16
поделиться

4 ответа

You'll have to add KnownTypes attribute on the class definition above your class definition for each usage of T. Like this:


[KnownType(typeof(ContentItem))]
[DataContract(Name = "PageableList_Of_{0}")]
public class PageableResults<T>
{
    [DataMember]
    public IList<T> Items { get; set; }
    [DataMember]
    public int TotalRows { get; set; }
}

[OperationContract]
PageableResults ListCI();

Alternatively you can define your own collection class, that has a TotalRows property, like this:


[KnownType(typeof(ContentItem))]
[DataContract(Name = "PageableList_Of_{0}")]
public class PageableResults<T> : EntityCollectionWorkaround<T>
{   
    [DataMember]
    public int TotalRows { get; set; }
}

Where EntityCollectionWorkaround is defined here:
http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html

1
ответ дан 17 December 2019 в 18:18
поделиться

Я не думаю, что вы сможете это сделать. Как сериализатор узнает, до чего десариализоваться? Многие вещи могут реализовать IList, а интерфейс не имеет конструктора.

1
ответ дан 17 December 2019 в 18:18
поделиться

Похоже, что это ошибка в WCF, которая исправлена ​​в .NET 4. Однако в этом потоке есть несколько обходных путей:
http://connect.microsoft. com / wcf / feedback / ViewFeedback.aspx? FeedbackID = 433569

Сводка:
- Поместите сборки, содержащие DataContracts, в GAC.
- Установите для параметра LoaderOptimization значение SingleDomain.

1
ответ дан 17 December 2019 в 18:18
поделиться

Inherit from PageableResults to make a closed generic subclass, in your case PageableContentItem or something like that, and use that as return type. With webservices normally the xml serializer is used and it needs to know everything in advance, that's why you can't return interface types as well.

    public class PageableContentItem
        : PageableResults<ContentItem>
    {

    }

[OperationContract]
PageableContentItem ListCI();
0
ответ дан 17 December 2019 в 18:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: