Comment mettre en œuvre hérité d'un Dictionnaire de plus de WCF
Je suis en train de mettre en œuvre un dictionnaire pour une utilisation avec WCF. Mes besoins sont:
- réelle (variable privée ou de la base de
classe) type équivalent à
Dictionnaire - Comparer
=System.StringComparer.InvariantCultureIgnoreCase
- Personnalisé (override/nouveau) Add(clé,
valeur) méthode (à inclure
validations). - Substituer ToString()
- Utilisation du même type sur le client et l'hôte
J'ai tenté à l'aide de cette classe dans un projet commun partagé par la FMC de l'hôte et des projets du client:
[Serializable]
public class MyDictionary : Dictionary<string, object>
{
public MyDictionary()
: base(System.StringComparer.InvariantCultureIgnoreCase)
{ }
public new void Add(string key, object value)
{ /* blah */ }
public override string ToString()
{ /* blah */ }
}
[DataContract]
[KnownType(typeof(MyDictionary))]
[KnownType(typeof(object[]))]
[KnownType(typeof(double[]))]
[KnownType(typeof(string[]))]
[KnownType(typeof(DateTime[]))]
public class ResultClass
{
public object Value{ get; set; }
/* More properties */
}
public class ParmData
{
public object Value{ get; set; }
/* More properties */
}
[DataContract]
[KnownType(typeof(MyDictionary))]
[KnownType(typeof(object[]))]
[KnownType(typeof(double[]))]
[KnownType(typeof(string[]))]
[KnownType(typeof(DateTime[]))]
public class ParameterClass
{
public List<ParmData> Data{ get; set; }
/* More properties */
}
[OperationContract]
ResultClass DoSomething(ParameterClass args);
Résultats:
- Quand je passe la Mondictionnaire comme l'un des ParameterClass.Les données.Éléments de valeur, je reçois un manque KnownType exception.
- Je peux revenir en toute sécurité Mondictionnaire dans le ResultClass, mais ce n'est plus mon type. C'est juste un Dictionnaire, et n'est pas moulage à
MyDictionary
. Également comparer =System.Collections.Generic.GenericEqualityComparer<string>
, pas la casse comparer, je suis à la recherche d'.
L'aide que je demande, c'est de soit réparer ma tentative a échoué, ou d'une façon totalement différente à la réalisation de mes exigences énoncées. Aucune solution ne doit pas nécessiter la copie d'un dictionnaire à un autre.
Grâce
Est un NetDataContractAttribute une option viable? C'est, êtes-vous en mesure d'avoir des copies de la même assemblée avec votre Mondictionnaire classe de garantie disponible à la fois du client et du serveur?
Merci pour la réponse à mon post, mais vous n'avez pas répondu: est-ce que le code que j'ai posté travailler avec votre installation? Ou faut-il lever une exception (ou de ne pas apporter les données)?
Marc - je n'en ai fait 1 tentative avec votre test. clone.De données a généré une valeur nulle exception. Merci pour l'aide, mais jezell m'a orienté dans le bon sens.
Merci pour la réponse à mon post, mais vous n'avez pas répondu: est-ce que le code que j'ai posté travailler avec votre installation? Ou faut-il lever une exception (ou de ne pas apporter les données)?
Marc - je n'en ai fait 1 tentative avec votre test. clone.De données a généré une valeur nulle exception. Merci pour l'aide, mais jezell m'a orienté dans le bon sens.
OriginalL'auteur chilltemp | 2008-11-05
Vous devez vous connecter pour publier un commentaire.
Ajouter CollectionDataContract de la classe Dictionary:
Pour plus d'informations sur l'utilisation de la collecte de données des contrats de mettre en œuvre les dictionnaires, suivez ce lien:
http://msdn.microsoft.com/en-us/library/aa347850.aspx
Le sérialiseur prend en charge en fonction de dictionnaire des collections, même sans l'attribut - ce simplement personnalise le schéma (noms, etc)
OriginalL'auteur jezell
Préambule: notez que l'ajout d'un "nouveau"
Add
qui n'empêche pas d'appeler l'ancienAdd
simplement par la coulée. Aussi, en termes de "mex", qui est une très vague de données-contrat - t-il besoin d'être si ouvert? (beaucoup deobject
etc...)D'abord: n'avez-vous pas manqué un peu de
[DataContract]
/[DataMember]
marqueurs? En particulier:Pouvez-vous préciser exactement la version de .NET vous utilisez?
DataContractSerializer
etc ont été ajustés via les service packs. Avec 3.5 SP1 est installé (la seule chose que j'ai à la main), il le fait au moins sérialiser et désérialiser viaDataContractSerializer
(pas de pile WCF), et de la bonneAdd
méthode est appelée.Pouvez-vous vérifier si les ouvrages suivants avec votre version locale? (il fonctionne pour moi avec la version 3.5 SP1 et avec les attributs manquants) [sortie]:
Code:
Évidemment, ce n'juste des tests
DataContractSerializer
(sans l'ensemble de la pile WCF), mais il semble fonctionner... donc: est-ce le même code fonctionne avec votre version locale de la .NET? Si non, est l'installation de la dernière version 3.0 service pack, une option? (idéalement, via l'installation de 3.5 SP1).Pour info, je reçois xml:
Mais ça fonctionne?
Hmmm... ça ressemble à 3.0SP1
OriginalL'auteur Marc Gravell
CollectionDataContract
attribut comme jezell suggéréSource: WCF Type de Collection de Partage
OriginalL'auteur chilltemp
J'ai enfin trouvé une façon de le faire. J'ai trouvé ce lien qui irait dans la bonne direction, mais je vais essayer de résumer.
[CollectionDataContract]
à votre collection personnaliséeLe remplacer par le code xml suivant.
OriginalL'auteur Shaun Bowe