2010-08-16 8 views
2

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?

Répondre

1

Avez-vous essayé pas makring vos entités avec DataContract et DataMember du tout (de sorte que par défaut sérialisation est utilisé) et marquer les propriétés de classe de base avec IgnoreDataMember?

Vous avez toujours plusieurs choix et je suis affraid vous pas comme l'un d'eux.

  • Créer un ensemble d'objets DTO et convertir des entités en DTO. Généralement, la meilleure pratique si vous voulez cacher votre implémentation interne.
  • Créer une classe suroggate (mise en œuvre IDataContractSuroggate) pour chaque entité, de sorte que vous avez le contrôle sur sérialisation - Je ne suis pas sûr que cela évite le problème.
  • Mise à niveau vers .NET 4.0 et utiliser EF avec des classes POCO (pas de EntityBase en tant que parent)

Meilleures salutations, Ladislav

+0

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. –

0

Je pense que vous devez utiliser l'attribut KnownType. Par exemple voir WCF issues with KnownType for Dictionary

[EDIT] Une discussion plus complète de ce problème et sa solution peut être trouvée ici: WCF: Interfaces, Generics and ServiceKnownType

+0

Merci Peladao, j'ai essayé déjà en utilisant KnownType (à la fois la classe de base et dérivés class) mais il lancerait quand même l'erreur si la classe elle-même n'était pas marquée avec l'un des deux attributs de sérialisation. –

Questions connexes