2009-08-12 3 views
1

Es ist möglich, eine Instanz einer Klasse an eine Webmethode auf einem Webserver zu senden, nicht wahr? (Die Klasse wird tatsächlich auf dem Webserver erstellt).An den Web-Service gesendete Objekte Enthält "null" Eigenschaft

Ich frage, weil ich eine bevölkerte Klasseninstanz habe, die ich versuche, zurück an den Webserver zu senden, aber wenn die Instanz bei der Webmethode ankommt, wurde sie geleert (eine neue Instanz wurde erstellt) ??

Einige Code, erklären helfen können:

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, loszuwerden '[Serializable]'. Der XML-Serializer beachtet dies nicht. –

Antwort

2

Sie müssen einen Setzer für angeben, sonst wie kann die Klasse einmal deserialisiert werden?

Versuchen

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

Prost, dass Schnipsel das Problem gelöst. Ein sehr einfacher Fehler, komplett vergessen zu setzen. Ich habe nichts gemacht, aber es war der erste Satz, der benötigt wurde – SumGuy

3

Wenn Sie [WebMethod] verwenden, dann wird typischerweise XmlSerializer hinter den Kulissen verwendet wird. Es sieht aus wie das größte Problem ist Ihre leere set auf pickingDetail. Da XmlSerializer ein set auf Listen/Arrays erfordert, würde ich wahrscheinlich halten Sie es einfach und Gebrauch:

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

(und vielleicht ist es in dem parameterlos Ctor initialisieren Verbrauch einfach zu machen)

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

Für Infos neige ich dazu, .NET-Namenskonventionen in der C# und xML-Konventionen in der xML verwenden - zum Beispiel:

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

Für Informationen, DataContractSerializer (standardmäßig in WCF-Diensten verwendet) hat diese lästige Notwendigkeit für einen Setter nicht. Sie könnten auch zu WCF wechseln ...

+0

Danke, diese Antwort gab mir einige nützliche Informationen – SumGuy

Verwandte Themen