2009-08-12 5 views
1

クラスのインスタンスをWebサーバー上のWebメソッドに送信することは可能です。 (クラスは実際にWebサーバー上に作成されます)。Webサービスに送信されたオブジェクトに「null」プロパティが含まれています

ウェブサーバーに返信しようとしている入力済みのクラスインスタンスがあるので質問しますが、インスタンスがWebメソッドに到着したときに空になっています(新しいインスタンスが作成されました)。説明するのに役立つかもしれ

いくつかのコードは:

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

を試してみてください。 XMLシリアライザはそれに注意を払わない。 –

答えて

2

pickingDetailのセッターを提供する必要があります。それ以外の場合は、クラスを一度に逆シリアル化する方法はありますか?

はところで、 `` [Serializableを]を取り払う

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

乾杯、そのスニペットは問題を解決しました。非常に単純な間違いは、設定を完全に忘れてしまった。何もしていないが、これは最初のセットが必要だった – SumGuy

3

あなたが[WebMethod]を使用している場合、一般的にXmlSerializerは背後で使用されています。最大の問題は、空のsetpickingDetailにあるようです。 XmlSerializer、リスト/アレイ上setを要求しているので、私はおそらく、シンプルで使い、それを維持したい:

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

(そしておそらく使い方を簡単に作るためにパラメータなしのctorの中でそれを初期化)の情報については

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

、私は、XMLでC#で.NETの命名規則、およびXML規則を使用する傾向がある - 例えば:

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

情報の場合、DataContractSerializer(デフォルトでWCFサービスで使用されています)は、この厄介なセッターの必要はありません。また、WCFに切り替えることもできます。

+0

ありがとう、この回答は私にいくつかの有用な情報を与えました – SumGuy

関連する問題