2010-05-29 28 views
2

我希望能夠通過WebService發送一個XmlSerializer類(它在遠程C#應用程序中顯而易見),然後將它反序列化到一個類中。 (我不知道它的可能要麼)如何將XmlSerializer類發送到WebService然後反序列化它?

我的班級:

SystemInfo 

我序列化這樣說:

 XmlSerializer mySerializer = new XmlSerializer(typeof(SystemInfo)); 
     StreamWriter myWriter = new StreamWriter(textBox1.Text); 
     mySerializer.Serialize(myWriter, sysinfo); 

如何建立WebService的?

[WebMethod] 
    public void Reports(XmlSerializer xmlSerializer) 
    { 
     . 
     . 
     . 
    } 

任何人都可以幫我嗎?

問候

+1

爲什麼你要序列化到一個文本框,如果你想調用一個web服務? 爲什麼不簡單地嘗試定義WebMethod來接受SystemInfo? – Cheeso 2010-05-29 13:11:15

+0

Ups,那不應該在那裏..我在本地測試它。發送一個類,我發送一個對象,然後將其轉換爲類? – pee2002 2010-05-29 13:31:16

回答

1

克里斯,感謝您的幫助。這是向前邁進的一大步。

我解決了發送XML字符串的問題:

 SystemInfo sysinfo = new SystemInfo(); 
     sysinfo.RUN(); 

     XmlSerializer mySerializer = new XmlSerializer(typeof(SystemInfo)); 

     MemoryStream memStream = new MemoryStream(); 
      mySerializer.Serialize(memStream, sysinfo); 
      memStream.Seek(0, System.IO.SeekOrigin.Begin); 
      XmlDocument doc = new XmlDocument(); 
      doc.Load(memStream); 
     memStream.Close(); 

     localhost.WS_Agente dasdsa = new localhost.WS_Agente(); 
     dasdsa.Reports(doc.InnerXml); 

而且WebService的:

[WebMethod] 
    public void Reports(string xml) 
    { 
     XmlSerializer mySerializer = new XmlSerializer(typeof(SystemInfo)); 
     SystemInfo obj = (SystemInfo)mySerializer.Deserialize(new StringReader(xml)); 
    } 

它的工作就像現在一個魅力:)

我的問題是:我可以提高代碼?

謝謝

+0

看看您的解決方案,我認爲這指出了我的答案中的問題:「如果您事先知道要傳遞哪些類型,那麼您還可以聲明更強類型的Web方法,並顯式創建您期望的類型的方法收到」。由於你的代碼被硬編碼以便與SystemInfo一起工作,爲什麼現在只需讓該方法接受該類型的參數呢? [WebMethod] public void Reports(SystemInfo si){...}。如果參數本質上是動態的,你應該只需要序列化? – 2010-05-29 19:49:54

+0

要回答你的其他問題,通過使用StringWriter,你的客戶端代碼可能會更簡單一些。像這樣 XmlSerializer xs = new XmlSerializer(typeof(SystemInfo)); StringWriter sw = new StringWriter(); xs.Serialize(sw,si); ws.Reports(sw.ToString()); – 2010-05-29 19:55:37

+0

非常感謝!現在它很棒! 你是男人! – pee2002 2010-05-29 20:35:14

3

首先,我假設你想通過任意類型的單一網絡的方法,該類型由客戶端和服務器共享。

發送XmlSerializer並沒有多少意義,它只具有序列化/反序列化的邏輯。它沒有實際的數據,即讀取/寫入流。你應該做的是傳遞一個字符串或XmlNode。

Web服務的調用者然後可以將XmlSerializer的客戶端端實例並將該對象序列化爲字符串,然後調用傳遞該字符串作爲參數的Web方法。它自己的web方法可以創建一個XmlSerializer實例,並將字符串反序列化爲一個對象。當然,要創建序列化程序的服務器大小實例,您需要知道創建序列化程序的根類型,您可以將其作爲類型名稱傳遞,並使用Type.GetType()來獲取傳遞給XmlSerializer的正確類型。

如果您事先知道要傳遞哪些類型,那麼您還可以聲明更強類型的Web方法,並明確地爲您希望接收的類型創建方法。

如果連線格式不是太多的問題,您也可以使用SoapFormatterBinaryFormatter來處理序列化/反序列化。在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()); 
+0

嗯,現在有道理:)你可以給我一個例子,在序列化完成後做這件事嗎? – pee2002 2010-05-29 14:12:15

+0

@ pee2002,當您的評論發佈時,對不起,我將添加一些簡單的示例。 – 2010-05-29 14:15:12

+0

對不起,沒有工作:\它給我錯誤:「輸入流不是有效的二進制格式。起始內容(以字節爲單位)是:3C-3F-78-6D-6C-20-76-65-72 -73-69-6F-6E-3D-22-31-2E ...「 – pee2002 2010-05-29 15:08:58

相關問題