2010-11-04 60 views
4

我準備編寫一個獨立於平臺的套接字協議。經過一些初步的研究protobuf似乎要走了。我對protobuf是新手,我似乎無法弄清楚一個具體問題。獨立於平臺的protobuf套接字協議 - 我將收到哪些消息?

我的要求是:

  • 完全獨立於平臺的客戶端;

  • C#server;

  • 異步消息通信;

  • .proto文件開始工作(所以沒有現有類的推理);

  • 必須能夠發送消息,而不需要服務器/客戶端知道預期的消息類型。

我已經找到了(De)SerializeWithLengthPrefix方法,它們是一個開始。 我無法弄清楚的是如果我不知道預先輸入的類型,如何接收消息。

我已經看到protobuf-net支持繼承,並且可以檢測消息的類型,所以對於protobuf-net,繼承所有來自公共基類型的消息都可以。 但是,這不是平臺獨立的,我正在尋找一種獨立於平臺的方式。

所以我的問題是:我如何發送我的消息,以便任何客戶端可以反序列化他們而不知道類型?

回答

2

如果要求與不同類型的多個消息的工作:

僅有一個唯一的號碼與每個不同類型的消息相關聯,並作爲一個前綴添加到消息中使用;您可以使用可選的整數參數對重載的SerializeWithLengthPrefix方法執行此操作。客戶端將不得不預先處理這個前綴(或者它可以在protobuf-net中由Serializer.NonGeneric處理,其中有一個反序列化方法,該方法提供了從該前綴號碼獲取類型的回調)。


如果要求與完全未知的數據工作:

給你的要求,我嫌疑Jon's port會是更好的選擇;因爲你的重點是平臺獨立性和.proto,而不是推論(其中protobuf-net擅長)或其他.NET特定的擴展/實用程序。

請注意,雖然.proto 可以(通過protoc)編譯爲常規protobuf流,但在接收方處理完全外部數據是......不規則。它可以通過將所有內容視爲擴展或通過處理編碼流來完成,但是......


編輯在評論下面的討論:

這裏的一個簡單的模式可以是簡單的:

message BaseMessage { 
    optional SomeMessage someMessage = 1; 
    optional SomeOtherMessage someOtherMessage = 2; 
    optional SomeThirdMessage someThirdMessage = 3; 
} 
message SomeMessage {...} 
message SomeOtherMessage {...} 
message SomeThirdMessage {...} 

(你可以選擇添加鑑別,是否有幫助)

這是其實本質上如何protobuf淨對待繼承,但很容易從其他客戶端表示,並自動處理所有子消息的長度。

+0

我想我可能不清楚我的問題。如果在客戶端有.proto文件和一個普通的protobuf實現,那麼我將擁有類和類。我唯一的問題是如何確定接收消息的類型。通過protobuf-net,我可以通過繼承來完成此任務,但是我如何以獨立於平臺的方式執行此操作。也許我不明白你的答案,但我不能把「外國數據放在接收器上」。 – 2010-11-04 08:40:31

+0

@Pieter - 我明白了 - 看到我的編輯;明確地說,我認爲繼承在這裏是非常錯誤的方法。讓我知道你是否想要更多的細節,但這種方法實際上是非常基本的 - 如果有必要的話,它可以是客戶端的「開關」。 – 2010-11-04 08:41:16

+0

好的,但是這意味着我必須自己解析前綴,因爲我無法再使用'DeserializeWithPrefixLength'。那是對的嗎?我希望像這樣的'TryReadLengthPrefix' **'AndTag' **。 – 2010-11-04 08:45:59