j'ai différentes classes que je veux exposer comme des types complexes dans WCF, donc j'ajouter [DataContract] et [DataMember] attributs nécessaires sur ces types et propriétés. Cependant, si je veux qu'ils héritent d'une classe de base abstraite (par exemple Person hérite de EntityBase), j'obtiens une erreur que le type "ne peut pas hériter d'un type qui n'est pas marqué avec DataContractAttribute ou SerializableAttribute".Hériter de la classe abstraite WCF sans exposer cette classe
Le problème est, si j'ajoute [DataContract] attribut à la classe de base, cette classe de base est exposée au client via le WSDL. Je suppose que ce n'est pas un gros problème, mais je préférerais que mon client ne soit pas au courant de ma mise en œuvre interne. Si j'ajoute l'attribut [Serializable] à la classe de base, alors il semble fonctionner au début (il peut être sérialisé mais EntityBase n'a pas été référencé dans le WSDL), mais maintenant si j'ajoute des propriétés à EntityBase alors se plaindra également que ses propriétés ne sont pas sérialisables. (Par exemple, j'ajoute une ICollection, puis j'obtiens une erreur que RuleViolation n'est pas sérialisable).
Malheureusement, il ne semble pas y avoir d'analogue à [IgnoreDataMember] pour un type [Serializable] ([NonSerialized s'applique uniquement aux champs, pas aux propriétés).
Donc, fondamentalement, je veux déclarer ce type de base mais n'a besoin d'aucun de ses membres à être sérialisés; est-il possible de configurer ceci dans WCF afin que le client ne voit pas ce type de base?
Merci pour les suggestions Ladislav. Je l'ai dit que je suis déjà en utilisant EF4/POCO, EntityBase est ma propre, ne fait pas partie de EF. Je n'ai pas essayé d'utiliser la sérialisation "par défaut" mais je ne suis vraiment pas à l'aise avec son modèle de type "opt out". Vous avez raison sur la possibilité d'utiliser DTO mais à ce stade, le "problème" n'est pas assez grave pour en valoir la peine. –