2009-08-12 9 views
1

Il est possible d'envoyer une instance d'une classe à une méthode Web sur un serveur Web n'est-ce pas. (La classe est réellement créée sur le serveur web).Objet envoyé au service Web Contient "null" Propriété

Je demande parce que j'ai une instance de classe peuplée que j'essaye de renvoyer au serveur Web, cependant quand l'instance arrive à la webmethod, elle a été vidée (une nouvelle instance a été créée)?

code qui peuvent aider à expliquer:

private void miIssue_Click(object sender, EventArgs e) 
    { 
     string r = sC.updatePickItem(batch, deptID, issued, pL); 
    } 

    //The creation of the webserver class I want to pass 
    [Serializable] 
    public class PickingList 
    { 
     List<PickingDetails> pD = new List<PickingDetails>(); 

     public bool found { get; set; } 
     public PickingDetails[] pickingDetail 
     { 
      get { return pD.ToArray(); } 
      set { } 
     } 

     public void addPickingDetail(PickingDetails pI) 
     { 
      pD.Add(pI); 
     } 
    } 

    [Serializable] 
    public class PickingDetails 
    { 
     public string warehouse { get; set; } 
     public string stockCode { get; set; } 
    } 

    //The webmethod I'm connecting to 
    [WebMethod] 
    public string updatePickItem(string batch, string deptID, bool issued, PickingList pL) 
    { 
     try 
     { 
      if (!issued) 
       issued = issueStockToWIP(rows, batch, deptID, pL); 
     } 
     catch (Exception e) 
     { return e.ToString(); } 
    } 
+0

BTW, se débarrasser de '[Serializable]'. Le XML Serializer ne fait pas attention à cela. –

Répondre

2

Vous devez fournir un setter pour pickingDetail, sinon comment le cours peut-il être rempli une fois désérialisé?

Essayez

set { 
    pD.Clear(); 
    foreach (PickingDetails p in value) 
    addPickingDetail(p); 
} 
+0

A la vôtre, cet extrait a résolu le problème. Une erreur très simple, complètement oublié de définir. Je ne faisais rien d'autre que d'obtenir, c'était le premier jeu requis – SumGuy

3

Si vous utilisez [WebMethod], puis généralement XmlSerializer est utilisé dans les coulisses. Il semble que le plus gros problème est votre vide set sur pickingDetail. Étant donné que XmlSerializer exige une set sur les listes/tableaux, je serais probablement rester simple et utilisation:

[XmlElement("pickingDetail") 
public List<PickingDetails> Details {get;set;}   

(et initialize peut-être dans le parameterless cteur pour faire simple d'utilisation)

public PickingList() { 
    Details = new List<PickingDetails>(); 
} 

Pour info , je tends à utiliser les conventions de nommage .NET dans le C# et conventions xml dans le fichier XML - par exemple:

[XmlElement("found")] // or XmlAttribute 
public bool Found { get; set; } 

Pour info, DataContractSerializer (utilisé dans les services WCF par défaut) n'a pas ce besoin ennuyeux pour un setter. Vous pouvez également passer à WCF ...

+0

Merci, cette réponse m'a donné quelques informations utiles – SumGuy

Questions connexes