Skip to main content
 首页 » 编程设计

c#之发送到 Web 服务的对象包含 "null"属性

2024年02月03日27cmt

可以将类的实例发送到网络服务器上的网络方法,不是吗? (该类实际上是在网络服务器上创建的)。

我问是因为我有一个已填充的类实例,我正试图将其发送回网络服务器,但是当该实例到达网络方法时,它已被清空(已创建一个新实例)??

一些可能有助于解释的代码:

    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(); } 
    } 

请您参考如下方法:

如果您使用的是 [WebMethod],那么通常在幕后使用 XmlSerializer。看起来最大的问题是您在 pickingDetail 上的空 set。由于 XmlSerializer 需要列表/数组上的 set,我可能会保持简单并使用:

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

(并可能在无参数 ctor 中初始化它以简化使用)

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

关于信息,我倾向于在 C# 中使用 .NET 命名约定,在 xml 中使用 xml 约定——例如:

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

有关信息,DataContractSerializer(默认情况下在 WCF 服务中使用)没有这种恼人的 setter 需求。您也可以切换到 WCF...