2012-05-23 28 views
0

所以我有一個基本的UDP服務器,我已經實現了一些東西,像恢復字節數組一樣,它究竟是如何被客戶端發送的(如果它被無序地檢索到)。 Bassicaly,我有客戶端,服務器和共享類庫,其類型可以從客戶端發送到服務器,反之亦然。所以現在我想出了一些想法來序列化一些對象併發送到服務器/客戶端。但我需要知道接收了哪種類型的對象以正確地反序列化它。想到兩個想法來解決這個問題:如何通過哈希值來識別類型?

  • 做一個「握手」。發送有關將要發送的對象,其長度,類名稱等數據,然後再檢索實際數據並將其反序列化。我知道這樣做,但由於它是UDP,這個「握手」可能會丟失,我需要重新提問,所以存在相當複雜的邏輯和網絡過度使用情況,但我知道如何實現這一點。
  • 第二個是通過一些散列值來識別類型。所以客戶端發送的數據包含類型和數據片段的散列值(我只會發送自己類型的對象,因此不需要爲C#和框架類型實現此功能),並且需要通過此散列值確定類型,服務器可以正確地實現它。

那麼有什麼想法,該如何實現呢?這將是完美的,如果我管理,以避免反光,因爲它的速度慢(我不關心巨大的switch語句,如果它工作更快)

+0

我假設你有你自己的協議,因爲你通過UDP發送字節。所以我會說有一個保留的字節或兩個,你可以用它來確定你正在發送/接收什麼類型的對象。隨你便。 – BeemerGuy

+0

不,只是標準[二進制序列化](http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx)此刻 – dantix

+0

這個想法仍然存在:你可以發送一個序列化的類型,在對象之前發出什麼信號 – 2012-05-23 22:37:57

回答

0

我今天剛做了一個我正在研究的原型。我這樣定義了我的消息流:

前4個字節:作爲Int32的程序集限定類型名稱的長度。

接下來的n個字節(其中n由前4個字節給出):該類型的裝配限定名稱。

休息消息:序列化的對象

它的工作就像一個魅力。

+0

並使用反射類型轉換爲所需類型? – dantix

+1

@Dantix Casting是一個靜態編譯時的概念;您無法投射只在運行時才知道的類型。你認爲什麼情況會需要演員?如果你正在調用一個比'object'更具體的類型的方法,你將不得不使用反射來調用這個方法。當你在'MethodInfo'上調用'Invoke'時,參數將傳遞給'object'數組;有一個運行時類型檢查,但沒有靜態轉換。 – phoog

+1

此外,添加的消息長度的int值,以檢查是否檢索完整的消息或它的 – dantix

0

只是使對象數據的對象類型部分,並使用完全相同的送他們兩個邏輯。不要試圖在網絡級別單獨處理它們。

+0

我應該知道類型之前,它需要它:) – dantix

+0

正確的,但那是在收到它之後。所以這對網絡層不是問題。 –