2009-11-11 80 views
1

我已經開始在VS2005中開發一個新的Web服務。只有一個方法:C#web服務...返回嵌套的自定義對象

[WebMethod] 
[XmlInclude(typeof(Person))] 
public PersonAction GetAction() 
{ 
    PersonAction action = new PersonAction(); 
    return action; 
} 

其中PersonAction類包含一個Person

[Serializable] 
public class PersonAction  
{ 
    private string actionName = "XAction"; 
    private Person person1; 
    private Person person2; 

    public PersonAction() 
    { 
     this.person = new Person(); 
     this.person.Name = "P1"; 
    } 

    public string Name 
    { 
     get 
     { 
      return this.actionName; 
     } 
    } 
    [XmlElement(Type = typeof(Person))] 
    public Person Person1 
    { 
     get 
     { 
      return this.person1; 
     } 
    } 
} 

我已經建立了它,運行它參照的場......但WSDL它總是包含空標記PersonAction ...沒有嵌入類型的定義可用,所以我在客戶端總是空。

XmlElementXmlInclude[Serializable]顯然沒有任何效果...

我相信我想念的東西。
肯定有人在過去遇到過這個問題,並且知道解決方案。我真的很感謝VS2005(.NET 2.0)的任何代碼,這將有所幫助。

謝謝

+0

我可以看到,在將所有私有字段更改爲公共後,它就可以工作......但是,如果公共屬性引用私有字段,那麼爲什麼公共屬性未被序列化呢? – Learner 2009-11-11 14:30:53

回答

1

您的變更公開變量似乎可以解決它,但並不真的。該服務現在序列化公共變量,而不是屬性。

嘗試將變量重新更改爲私人,並添加「setter」函數。我相信這是序列化所必需的。

+0

非常感謝您寶貴的建議。有些東西告訴我你對「setter」:)是正確的。我們來看看(5分鐘)。謝謝 – Learner 2009-11-11 14:48:46

0

你可能會丟失你的人稱動作類XmlRoot屬性。 XmlInclude也可能是不必要的。

編輯補充:

  • 我使用(在我ASMX/.NET 2.0 Web服務)XmlRoot和不使用XmlInclude。
  • 我注意到一件奇怪的事情:你的屬性是隻能得到的。我相信這個約定是爲了在可序列化類中獲得數據持有屬性。
  • 您可以嘗試的另一件事是獲取服務的WSDL,通過WSDL實用程序運行它,瞭解wsdl.exe如何生成可序列化的類並查看差異 - 當然,這是一個.NET 2.0/ASMX特定的建議。
+0

非常感謝您的快速響應......我可以看到,在將所有私有字段更改爲公共後,它才能正常工作......但是,如果公共屬性在引用私有字段時未被序列化? – Learner 2009-11-11 14:22:57

+0

btw ... XMLRoot沒有幫助 – Learner 2009-11-11 14:30:14

+0

是的,「setter」是問題,正如'jvenema'也建議。非常感謝您 – Learner 2009-11-11 15:14:07