Serialisierung des WCF-Dienstobjekts

8

Ich habe eine abstrakte Klasse namens contact und eine andere Klasse namens client, die von contact erbt. Ich habe einen WCF-Dienst mit einer Methode, die einen Parameter vom Typ contact verwendet. Was ich jedoch habe, ist eine Instanz von Client, die ich weitergeben möchte. Im Angesicht dieses Fehlers:

  

Geben Sie 'xxx.Client' mit dem Datenvertragsnamen 'Client: http: //schemas.datacontract.org/2004/07/xxx' nicht ein. Fügen Sie statische Typen, die der Liste bekannter Typen nicht bekannt sind, hinzu, z. B. indem Sie das KnownTypeAttribute-Attribut verwenden oder diese zur Liste bekannter Typen hinzufügen, die an DataContractSerializer übergeben werden.

    
ancdev 15.05.2012, 14:47
quelle

3 Antworten

5

WCF arbeitet nicht direkt mit abstrakten Klassen. Sie sollten KnownType-Attribute für die Datenkontrakt- oder Serviceklasse verwenden. Unten sind Beispiele;

%Vor%     
daryal 15.05.2012, 14:51
quelle
7

Sie sollten DataContractSerializer wissen lassen, dass ein Client ein Typ von Contact ist.

Es gibt mehrere Möglichkeiten, dies zu tun, aber alle drehen sich um die Verwendung des KnownType Attribut oder die ServiceKnownType Attribute.

Der KnownType kann in der Klasse Client platziert werden, um DataContractSerializer mitzuteilen, dass es sich um einen KnownType von Contact handelt.

%Vor%

Der KnownType kann auch in einer Klasse platziert werden, um anzuzeigen, dass Sie beim Serialisieren dieser Klasse auch auf diese andere Klasse treffen können.

Sie können dies tun, wenn Sie eine Klasse DataContract mit einer Eigenschaft haben, die eine Contact ist, die tatsächlich eine Client enthalten kann:

%Vor%

In diesem Fall könnten Sie ohne Angabe des KnownType auf dem Client davonkommen. Sie können dies auch tun, wenn Sie über eine Eigenschaft verfügen, die eine Auflistung zurückgibt und Sie die Typen angeben möchten, die in der Auflistung enthalten sein können.

Sie können anstelle des tatsächlichen Typs des KnownType den Namen einer statischen Methode angeben, die stattdessen die bekannten Typen zurückgibt:

%Vor%

Sie können den bekannten Typ auch über die angeben Konfigurationsdatei .

ServiceKnownTypes funktionieren auf ähnliche Weise, sind jedoch im Dienst selbst angegeben:

%Vor%

Diese Einstellung wird dem DataContactSerializer mitteilen, dass eine der Methoden möglicherweise den Typ Client zurückgibt. Ähnlich wie bei den bekannten Typen können Sie auch eine statische Methode verwenden, um die bekannten Dienste bereitzustellen.

    
Sam Holder 15.05.2012 14:52
quelle
2

Verwenden Sie die [KnownType] und [ServiceKnownType] Attribute, um die Beziehungen zu gewährleisten.

    
Chris 15.05.2012 14:50
quelle

Tags und Links