2010-06-23 16 views
20

Come si definisce DataContract per le classi astratte in WCF?Utilizzo di WCF con classi astratte

Ho una classe "Persona" che comunico correttamente utilizzando WCF. Ora aggiungo una nuova classe "Foo" a cui si fa riferimento da Person. Tutto ancora bene. Ma quando faccio Foo astratto e definisco una sotto-classe, invece fallisce. Fallisce sul lato server con una CommunicationException, ma questo non mi dice molto.

Le mie lezioni semplificato fatto per il test:

[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; } 
} 

risposta

30

L'ho capito. È necessario specificare le sottoclassi sulla classe base astratta usando "KnownType". La soluzione potrebbe essere quella di aggiungere questo sulla classe Foo:

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

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

Partenza this link.

+0

Perfetto. Grazie mille! –

2

interessante.

Mi aspetto che il codice non funzioni nel costruttore Person poiché non è possibile creare un'istanza diretta di una classe astratta.

+0

Buon punto. Questo potrebbe essere il motivo per cui è fallito? Trovato una soluzione però. Controlla la mia risposta .. – stiank81

Problemi correlati