2011-09-12 2 views
1

Я пытаюсь сделать проход класса через WCF. Это не проблема, кроме моего абстрактного класса, который не сериализуется. Есть ли способ избежать этого?Проблема с абстрактными свойствами класса Сериализация через WCF

[DataContract] 
[KnownType("GetKnownTypes")] 
public class BusinessObject 
{ 
    public static Type[] GetKnownTypes() 
    { 
     // only returns the different types my "Field" abstract class can take 
     return Services.WCFRIAKnownTypesHelperService.FieldsKnownTypes.ToArray(); 
    } 

    [DataMember] 
    public String ID { get; set; } 
    [DataMember] 
    public List<Section> Sections { get; set; } 
    [DataMember] 
    public List<Field> Fields { get; set; } 
} 

И теперь мой класс поле

[DataContract] 
public abstract class Field 
{ 
    [DataMember] 
    public String FieldID { get; set; } 
    [DataMember] 
    public String Title { get; set; } 
    [DataMember] 
    public Object Content { get;set; } 
} 

Почему не работает?

ответ

3

Атрибут [KnownType] ожидает статического типа должны быть переданы, которые должны быть известны во время компиляции:

[DataContract] 
[KnownType(typeof(SomeChildOfBusinessObject))] 
[KnownType(typeof(SomeOtherChildOfBusinessObject))] 
public class BusinessObject 
{ 
    ... 
} 

Если вы хотите зарегистрировать динамические известные типы вы можете посмотреть на following blog post.

+0

Моя проблема связана с классом Field, а не с BusinessObject, который хорошо разбирается. – Nicolas

+0

@Nicolas, о, извините. В этом случае вы должны украсить свой класс «Поле» атрибутом «KnownType», указав все возможные дочерние объекты. –

0

Вы не можете передавать неизвестные типы клиенту, хотя, если они унаследованы известным типом. При приведении типов ur к базовому классу объект по-прежнему остается дочерним классом и, следовательно, не может быть перенесен или сериализован. Вы можете использовать refecltion для регистрации динамических типов как известных типов, но опять же это может быть проблема десериализации динамических типов.

+0

Хорошо, я вижу. Есть ли способ, как я использую службы RIA, использовать «общий контекст» для этого? – Nicolas

+0

см. Это может помочь http://stackoverflow.com/questions/4495887/datacontract-serialize-abstract-class – hungryMind

Смежные вопросы