1

Erreur ci-dessous lors de la désérialisation du jeu de résultats (tuple) dans la fonction WCF.Erreur de désérialisation d'un n-uplet personnalisé dans WCF

Une erreur s'est produite lors de la tentative de désérialisation du paramètre XXX. S'il vous plaît voir InnerException pour plus de détails.

'System.Tuple' ne peut pas être sérialisé. Pensez à le marquer avec l'attribut DataContractAttribute et à marquer tous les membres que vous souhaitez sérialiser avec l'attribut DataMemberAttribute. Alternativement, vous pouvez vous assurer que le type est public et possède un constructeur sans paramètre - tous les membres publics du type seront alors sérialisés, et aucun attribut ne sera requis.

Voici la définition du tuple.

Classe publique XXX aaa Propriété publique En Nouvelle liste (de Tuple (bbb, ccc)) classe End

+0

Que dit l'exception interne, cela ne fournit pas suffisamment d'informations. – Mark

+1

Pouvez-vous publier le code de dé-sérialisation? –

+0

Fonction publique EndXXX (résultat ByVal en tant que System.IAsyncResult) As XXX Implements EndXXX Dim _args ((0) - 1) En tant qu'objet Dim _result As XXX = CType (MyBase.EndInvoke ("XXX", _args, result), XXX Retour _result Fin Fonction – beginer

Répondre

1

Untimely, vous devez faire une classe au lieu d'utiliser un tuple. L'exception indique que vous ne pouvez pas utiliser un Tuple parce que A) Il n'est pas marqué avec l'attribut DataContract et B) Parce qu'il n'a pas de constructeur sans paramètre. Ainsi, un Tuple<int,string> ne peut pas être réglé sur une new Tuple<int,string>();

Si la classe que vous avez envoyé via WCF était comme ça ...

public class MyClassToSendThroughWcf 
{ 
    public tuple<int,string> MyData {get;set;} //The tuple here is problem, replace with the class below... 
} 

Vous pouvez remplacer le type de « MyData » avec une classe qui fait la même chose comme ça ...

public class MyClassToUseWithWcf 
{ 
    public MyClassToUseWithWcf(){} 

    public MyClassToUseWithWcf(int i, string s) 
    { 
     Item1 = i; 
     Item2 = s; 
    } 

    public int Item1 {get;set;} 
    public string Item2 {get;set;} 
} 

Maintenant, les deux classes ont des constructeurs par défaut, donc il peut être sérialisé. Je suggère d'éviter les tuples de toute façon.

+0

J'ai utilisé l'attribut DataContract pour la classe. – beginer

+0

Vous avez probablement ajouté l'attribut à la classe qui contenait le tupel, mais je ne pense pas que vous pouvez ajouter l'attribut à la structure tupel elle-même. La classe que j'ai montré dans cette réponse est un remplacement pour votre tupel qui fonctionnera avec WCF. – Onosa

+0

J'ai ajouté quelques précisions à ma réponse. – Onosa

Questions connexes