Проблема с сериализацией свойств абстрактного класса через WCF - PullRequest
1 голос
/ 12 сентября 2011

Я пытаюсь сделать так, чтобы класс проходил через 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; }
}

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

Ответы [ 2 ]

3 голосов
/ 12 сентября 2011

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

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

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

0 голосов
/ 12 сентября 2011

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

...