2011-03-31 20 views
1

我有一個class MyClass包含一個private List<MySecondClass> myList序列化Web服務中的封裝列表

public IEnumerable<MySecondClass> MyList 
{ 
    get { return myList.Select(a => a); } 
} 

列表是通過公共AddItem(MySecondClass itemToAdd)ClearItems()方法修改:該列表是通過一個getter如下曝光。我相信這是一個正確的封裝列表。

的問題在於,我需要經由SOAP MyClass型(含有myList)的對象傳遞給web服務,其填充myList中(使用AddItem()方法),然後返回該對象。

但是,當webmethod返回類時,序列化後myList爲空。我懷疑這是因爲我沒有myList的setter,這導致列表在序列化過程中不被設置。

這是一個很好的假設,還是我的方式?如果問題是我認爲的問題,有沒有一種方法可以允許從webmethod成功傳遞列表而不破壞封裝(我不想公開一個通用列表)?

+0

是否有你使用ASMX而不是WCF的理由? – 2011-04-15 20:15:21

+0

@John原因是這是對WCF之前很久以前創建的現有應用程序的增強,因此我們所有的服務仍然是asmx。 – Andrew 2011-04-25 20:54:59

回答

1

儘管我從未真正解決過最初的問題,但我所做的工作是簡化傳遞給Web方法的數據。我不是將整個對象傳遞給Web方法,而是傳遞一個唯一標識符。 webmethod然後返回我需要的列表,並且實際處理將此列表中的項目添加到對象客戶端。

1

沒有直接嘗試這個我自己,我相信你一定是正確的。

在.NET中的序列化使利用只讀屬性一個有趣的馬戲團。因爲.net默認序列化過程需要一個setter屬性,以「反序列化」的對象。如果沒有setter屬性,序列化部分仍然可以工作,允許您序列化到驅動器或通過網絡。但是,反序列化過程會失敗,這肯定會成爲你收藏空的原因。我只是驚訝它並沒有錯誤的說實話。

您是否試圖添加一個簡單的setter來驗證這實際上是一個問題,這樣我們就能100%確定地知道這是解決問題之前的問題。

0

ASMX服務使用的XML序列化器只序列化公共讀/寫屬性。