2011-04-06 3 views
2

J'ai une classe dans un assembly distinct qui est exposé via un service WCF. Il est référencé dans mon service.Sérialisation d'un délégué dans WCF

Cette classe a plusieurs structs et un seul délégué, et je ne peux pas comprendre comment m'assurer qu'ils sont sérialisés. Quand je commente les structures de la classe, l'objet est sérialisé, sinon je reçois des erreurs.

J'ai décoré les structures avec [Serializable], mais cela ne fonctionne pas. Voici un exemple de l'un d'entre eux:

[Serializable] 
public delegate bool ValidationDelegateInt(pdInt structure); 

[Serializable] 
public struct pdInt 
{ 
    public pdInt(int i, bool b, int rh, int rl, bool mv, bool va, ValidationDelegateInt v) 
    { 
     Value = i; 
     IsRequired = b; 
     RangeHigh = rh; 
     RangeLow = rl; 
     MustValidate = mv; 
     IsValidated = va; 
     Validate = v; 
    } 

    public int Value; 
    public bool IsRequired; 
    public int RangeHigh; 
    public int RangeLow; 
    public bool MustValidate; 
    public bool IsValidated; 
    public ValidationDelegateInt Validate; 
} 

Voici un extrait pour montrer comment je les déclarais:

[Serializable] 
public class PDUser : Person, IValidate 
{ 
    #region Members 

    public pdInt SomeRange; 
    public pdString SomeString; 

Voici un code qui illustre comment je veux les utiliser sur le client .

private void bPDUserSelfDL_Click(object sender, EventArgs e) 
    { 
     Model.PDUser p = new Model.PDUser(); 
     p.Self(4); 
     p.SomeRange.Value = 1; 

     if (p.SomeRange.MustValidate) 
     { 
      bool IsValid = p.SomeRange.Validate(p.SomeRange); 
     } 

    } 

Voici le contrat de données:

[DataContract(Name = "PDUserSelfResultSet", Namespace = "V_1")] 
public class PDUserSelfResultSet 
{ 
    List<PDUser> m_PDUsers; 

    [DataMember] 
    public List<PDUser> PDUsers 
    { 
     get 
     { 
      return m_PDUsers; 
     } 
     set 
     { 
      m_PDUsers = value; 
     } 
    } 
} 

et dans mon service, voici comment je l'utilise:

public PDUserSelfResultSet PDUserSelf(int PersonID) 
    { 
     try 
     { 
      PDUserSelfResultSet s = new PDUserSelfResultSet(); 
      s.PDUsers = new List<PDUser>(); 

      PDUser p = new PDUser(); 
      s.PDUsers.Add(p.Self(PersonID)); 

      return s; 
     } 
     catch (System.Net.WebException we) 
     { 
      string s = we.Message; 
      throw we; 
     } 
     catch (FaultException fe) 
     { 
      string s = fe.Message; 
      throw fe; 
     } 
     catch (Exception e) 
     { 
      string s = e.Message; 
      throw e; 
     } 
    } 

Et sur le client, enfin voici comment je Je l'appelle:

private void Testing() 
    { 
     WCFHostServiceClient proxy = new WCFHostServiceClient(); 

     try 
     { 
      PDUserSelfResultSet r = new PDUserSelfResultSet(); 
      r = proxy.PDUserSelf(4); 
      List<PDUser> p = r.PDUsers.ToList<PDUser>(); 
      proxy.Close(); 
     } 
     catch (System.Net.WebException we) 
     { 
      string s = we.Message; 
     } 
     catch (System.ServiceModel.CommunicationException ce) 
     { 
      string s = ce.Message; 
     } 
    } 

Si je co mment les structs dans ma classe PDUser, puis dans ma méthode Testing() l'appel réussit. Si je laisse les structures, j'obtiendrai une exception CommunicationException, ce qui dans ce cas signifie que WCF ne sait pas comment gérer la structure.

Est-ce que quelqu'un sait comment créer un contrat de données pour que je puisse utiliser les structures?

+0

Le DataContractSerializer WCF utilise les attributs [DataContract] 'et [[DataMember]' - pouvez-vous les mettre dans vos structures? Décorez la définition de la structure avec '[DataContract]' et tous les membres que vous voulez sérialiser dans vos messages avec '[DataMember]'. Le '[Serializable]' n'a aucun impact et aucun effet sur la sérialisation de WCF que ce soit .... –

+0

marc_s, j'ai découvert la nuit dernière après que j'ai posté ceci que ce n'était pas la structure qui était le problème mais le délégué dans la structure. Si j'ai supprimé le délégué, la structure serait sérialisée. Et vous avez raison, la décoration sérialisée n'a aucun rapport avec cela. Merci pour votre réponse. – MikeMalter

Répondre

3

Le problème avec l'utilisation struct dans WCF était pas tant sur les struct eux-mêmes que ce qui était en eux. J'avais un délégué et cela causait le problème. Le problème plus général ici est qu'un délégué n'est pas compatible avec l'interopérabilité. À un moment donné, mon client voudra prendre en charge les tablettes iPad et autres et n'utilisera pas .NET, alors trouver comment soutenir les délégués dans la WCF sera contre-productif.

0
+0

sajoshi, merci pour votre réponse, il semble que la question est liée aux délégués et j'ai appris après le post que si je supprime le délégué, il n'y a pas de problème. Savez-vous comment sérialiser les délégués, et est-ce même une bonne approche interactive? – MikeMalter