1

我以爲我曾經在某處讀過Silverlight 4將包含BinaryFormatter以支持客戶端應用程序中的序列化/反序列化二進制數據,但似乎無法找到它,所以我猜測它不在那裏。反序列化Silverlight 4中的二進制數據

我有我需要從我的Silverlight 4應用程序訪問的現有服務。該服務使用TCP上的套接字。我已經能夠連接客戶端應用程序並能夠接收來自服務的消息,但是我無法反序列化消息的內容。

該消息由序列化的服務器上的以下對象的:

class Message 
{ 
    String Name { get; set; } 
    Stream Data { get; set; } 
} 

我沒有通過業務控制和改變文件格式,協議等是不是一個選項。 (另外,fwiw,Name是可變長度。)

如何在我的Silverlight客戶端中重構Message對象?

+0

非常有生產力的評論。嘗試回答我的一個問題,你可能會看到這個速度上升。 – SonOfPirate

回答

0

因此,經過多次試驗和錯誤,我終於找到以下解決方案來解決我的問題。

首先,我能夠訪問服務器代碼,它允許我更改Message類,而不是Data屬性返回一個Stream,它返回一個Byte數組。然後,我使用XmlSerializer將對象序列化爲傳出的NetworkStream。顯然XmlSerializer默認使用Base64編碼,並將字節數組轉換爲可包含在XML流中的字符串。

在Silverlight客戶端中,我使用XmlSerializer將字節數組反序列化到客戶端對象中。

與二進制序列化不完全相同,但最終目標是反序列化從SL客戶端上的套接字接收到的二進制數據(字節數組),並且這會將我帶到那裏。

2

我甚至不會嘗試爲Silverlight編寫二進制反序列化器(我甚至沒有相信它是可能的)。

取而代之(假設一個ASP.NET主機站點)我會在主機站點放置一個WCF服務作爲一種代理。 WCF服務將代表Silverlight應用程序向您的服務發出請求。

+0

它不是一個ASP.NET主機站點,它是一個推送模型(該服務將消息推送到客戶端應用程序,即沒有請求)。 – SonOfPirate

0

您是否在尋找BinaryReader

+0

我不這麼認爲。這可以幫助實現一個對象,但前提是你知道二進制數據的確切組成。正如我所提到的,它將包含一個可變長度的字符串和一個可變長度的Stream。 – SonOfPirate

+1

如何在服務器上序列化數據? –

+0

據我所知,通過對代碼進行反向工程,BinaryFormatter被用來將對象序列化爲一個流,然後將其複製到Socket使用的NetworkStream中。 – SonOfPirate

相關問題