2010-05-20 2 views
0

J'ai donné une juste lire msdn: DataContracts et je ne trouve pas pourquoi ce qui suit ne fonctionne pas. Alors qu'est-ce qui ne va pas ici? Pourquoi ExtendedCanadianAddress n'est-il pas reconnu par le sérialiseur datacontract?C# Héritant DataContract dérivés Types

Le type 'XYZ.ExtendedCanadianAddress' avec le nom de contrat de données 'CanadianAddress: http://tempuri.org/Common/Types' n'est pas prévu. Ajoutez tous les types ne sont pas connus statiquement à la liste des types connus - par exemple, en utilisant l'attribut KnownTypeAttribute ou en les ajoutant à la liste des types connus transmis à DataContractSerializer.

Étant donné:

namespace ABC 
{ 
[KnownType(typeof(Address))] 
public abstract class Z 
{ 
    //stuff 
    //method that adds all types() in namespace to self 
} 

[KnownType(typeof(CanadianAddress))] 
[DataContract(Name = "Address", Namespace = "http://tempuri.org/Types")] 
public class Address : Z 
{} 

[DataContract(Name = "CanadianAddress", Namespace = "http://tempuri.org/Types")] 
public class CanadianAddress : Address 
{} 
} 

namespace XYZ 
{ 
[KnownType(typeof(ExtendedCanadianAddress)) 
[DataContract(Name = "Address", Namespace = "http://tempuri.org/Types")] 
public class ExtendedAddress : Address 
{ 
    //this serializes just fine 
} 
[DataContract(Name = "CanadianAddress", Namespace = "http://tempuri.org/Types")] 
public class ExtendedCanadianAddress : CanadianAddress 
{ 
    //will NOT serialize 
} 
} 

Répondre

1

Je vais essayer une repro, mais dès le départ les attributs mal ... regarder

[DataContact] vs [DataContract] Notez le manque "r"

En outre, bien que votre C# namespaces sont différents espaces de noms de DataContract sont les mêmes et vous avez plus d'un contrat avec le même nom

Name = "CanadianAddress", Namespace = "http://tempuri.org/Types"

+0

Ce que j'est un contrat finalisé dans l'espace de noms ABC, et le contrat réemballés au sein de XYZ pour conclure le contrat de ABC avec les constructeurs alternatifs. Je suis en train d'obtenir moins de code en utilisant l'héritage. – user346375

+0

L'héritage est correct, mais chaque implémentation connue doit avoir un 'Name' unique ou résider dans un unique' Namespace'. Sinon, il n'y a aucun moyen de faire correspondre une requête à l'implémentation concrète correcte. – JoeGeeky

Questions connexes