2010-06-23 15 views
20

¿Cómo defino DataContract para clases abstractas en WCF?Uso de WCF con clases abstractas

Tengo una clase "Persona" que comunico con éxito utilizando WCF. Ahora agrego una nueva clase "Foo" a la que se hace referencia desde Person. Todo sigue siendo bueno Pero cuando hago que Foo sea abstracto y defino una subclase, falla. Falla en el lado del servidor con una CommunicationException, pero eso realmente no me dice mucho.

Mis clases simplificados para las pruebas realizadas:

[DataContract] 
public class Person 
{ 
    public Person() 
    { 
     SomeFoo = new Bar { Id = 7, BaseText = "base", SubText = "sub" }; 
    } 

    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public Foo SomeFoo { get; set; } 
} 

[DataContract] 
public abstract class Foo 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string BaseText { get; set; } 
} 

[DataContract] 
public class Bar : Foo 
{ 
    [DataMember] 
    public string SubText { get; set; } 
} 

Respuesta

30

Me di cuenta. Debe especificar las subclases en la clase base abstracta utilizando "KnownType". La solución sería añadir esto en la clase Foo:

[DataContract] 
[KnownType(typeof(Bar))] // <------ added 
public abstract class Foo 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string BaseText { get; set; } 
} 

Salida this link.

+0

Perfecto. ¡Muchas gracias! –

2

interesante.

Esperaría que el código fallara en el constructor Person ya que no se puede crear una instancia de una clase abstracta.

+0

Buen punto. Esa podría ser la razón por la cual está fallando? Encontré una solución sin embargo. Mira mi propia respuesta ... – stiank81