首先,我假設你想通過任意類型的單一網絡的方法,該類型由客戶端和服務器共享。
發送XmlSerializer並沒有多少意義,它只具有序列化/反序列化的邏輯。它沒有實際的數據,即讀取/寫入流。你應該做的是傳遞一個字符串或XmlNode。
Web服務的調用者然後可以將XmlSerializer的客戶端端實例並將該對象序列化爲字符串,然後調用傳遞該字符串作爲參數的Web方法。它自己的web方法可以創建一個XmlSerializer實例,並將字符串反序列化爲一個對象。當然,要創建序列化程序的服務器大小實例,您需要知道創建序列化程序的根類型,您可以將其作爲類型名稱傳遞,並使用Type.GetType()來獲取傳遞給XmlSerializer的正確類型。
如果您事先知道要傳遞哪些類型,那麼您還可以聲明更強類型的Web方法,並明確地爲您希望接收的類型創建方法。
如果連線格式不是太多的問題,您也可以使用SoapFormatter
或BinaryFormatter
來處理序列化/反序列化。在BinaryFormatter的後面的例子中,你會聲明你的web方法採用byte[]
參數,這些格式化程序(序列化程序)的優點是當你創建格式化程序的實例時,它們不需要關於類型的附加信息,但它們可以比一個XmlSerializer
更新慢:使用一個XmlSerializer增加了一些簡單的例子(未測試)
例子,在這裏你將需要從客戶端傳遞類型名稱,所以我做了一個額外的參數。使用BinaryFormatter的
[WebMethod]
public void Reports(string xml, string typeName)
{
XmlSerializer xs = new XmlSerializer(Type.GetType(typeName));
object obj = xs.Deserialize(new StringReader(xml));
// use the deserialize object
}
例,無類型名稱需要的,但你的類類型將需要serializable
[WebMethod]
public void Reports(byte[] data)
{
BinaryFormatter bf = new BinaryFormatter();
object obj = bf.Deserialize(new MemoryStream(data));
// use the deserialized object
}
在客戶端,你會使用類似以下使用BinaryFormatter的序列化。
// initialize the SystemInfo instance that you want to pass to the server
SystemInfo si = new SystemInfo() { SystemName = "My System" };
// Serialize to a memory stream
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, si);
// Call the service, passing the array from the memory stream
ws.Reports(ms.ToArray());
爲什麼你要序列化到一個文本框,如果你想調用一個web服務? 爲什麼不簡單地嘗試定義WebMethod來接受SystemInfo? – Cheeso 2010-05-29 13:11:15
Ups,那不應該在那裏..我在本地測試它。發送一個類,我發送一個對象,然後將其轉換爲類? – pee2002 2010-05-29 13:31:16