2011-12-18 19 views
20

Come utilizzare DataContract con ereditarietà? Il codice qui sotto funzionerà?DataContract ed ereditarietà?

[DataContract] 
public class ConsoleData 
{ 
    [DataMember] 
    public String Description { get; set; } 

} 

[DataContract] 
public class SomeData : ConsoleData 
{ 

    [DataMember] 
    public int Volume { get; set; } 
    ...... 
+0

Sì. Cosa stai cercando di fare con questi due contratti di dati? –

risposta

34

Sì, che avrebbe funzionato.

Il DataContractAttribute ha Inherited impostato su falso, quindi è necessario applicare l'attributo sia alla classe figlio che alla classe genitore (come è stato fatto nella domanda).


È necessario utilizzare l'attributo KnownType se si desidera utilizzare i contratti di dati con il polimorfismo.

Per esempio

[ServiceContract] 
interface MyWcfContract 
{ 
     [OperationContract] 
     HandleData(ConsoleData contractData); 
} 

Se è stato richiamato il metodo in questo modo:

SomeData someData = new SomeData { Description = "Test", Volume = 30 }; 
// The method is expecting a ConsoleData instance, 
// I'm passing a SomeData instance instead 
myWcfProxy.HandleData(someData); 

Poi il deserializzatore sulla fine servizio non sapere che è un esempio di SomeData, solo un'istanza di ConsoleData che si aspettava. Il modo per risolvere questo problema è registrare la classe SomeData come un tipo noto di ConsoleData.

+0

grazie, veramente aiutato e risolto i miei problemi – javapowered

+0

@Andrew. Sto combattendo con questi argomenti da molto tempo. È possibile avere in "[OperationContract] HandleData (Base di base)" e inviare da SoapUI alcuni oggetti gocciolati da 'Base'? E poi se C# sarà a conoscenza del fatto che su 'base' è l'istanza di qualche sottoclasse - quindi invoca anche metodi appropriati (polimorfismo e così via) –

+0

C'è stato un errore di sintassi minore in [KnownType (typeof (SomeData)) ] , Grazie per il post utile. – Shanjee

2

Avrete bisogno di utilizzare l'attributo KnownType se si utilizza il XmlSerializerFormat per il vostro ServiceContract:

[DataContract] 
public class ConsoleData 
{ 
    [DataMember] 
    public String Description { get; set; } 
} 

[DataContract, KnownType(typeof(ConsoleData))] 
public class SomeData : ConsoleData 
{ 
    [DataMember] 
    public int Volume { get; set; } 
} 
+0

cosa non funzionerà senza 'KnownType'? Ho provato il codice come ho scritto nella descrizione e sembra funzionare – javapowered

+1

. Chiedo questo. Ha senso inserire KnownType (typeof (SomeData)) nella classe base (ConsoleData), consentendo di passare un'istanza child a un metodo che si aspetta un'istanza di base. Ma non penso che tu debba metterlo sull'istanza del bambino. –

+0

@javapowered: fai attenzione se decidi di non utilizzare l'attributo KnownType perché ci sono casi speciali in cui è richiesto. Un esempio è se si dovesse esporre SomeData come proprietà di un altro DataContract. –

Problemi correlati