回答
您無法單獨檢測類型,因爲protobuf規範不會將任何數據添加到此流;但是,也有一些使這個容易,這取決於上下文的方法:
- (如由Jon提到的)聯合類型涉及一系列場景
- 繼承(protobuf網專用)可以是多才多藝的 - 你可以有一個基本的消息類型,以及任意數量的具體信息類型的
- 您可以使用前綴指示輸入型
最後的方法實際上是在原TCP的情況下非常有價值流;這是的網線與聯合類型相同,但具有不同的實現;通過預先確定1 = Foo,2 = Bar等(與聯合類型方法完全相同),可以使用SerializeWithLengthPrefix
來編寫(指定1/2/etc作爲字段編號),以及非通用TryDeserializeWithLengthPrefix
可以讀取(這是在v1 API中的Serializer.NonGeneric下,或者在v2 API中的TypeModel中),您可以提供一個類型映射表,將數字解析爲類型,然後反序列化正確的類型。並預先解決「爲什麼這對TCP流有用?」這個問題。 - 因爲:在正在進行的TCP流中,您需要需要使用WithLengthPrefix
方法總之,以避免過度讀取流;所以你不妨獲得免費的類型標識符!
摘要:
- 聯盟類型:易於實現;只有一邊是不得不然後檢查哪些屬性是非空的
- 繼承:易於實施;可以使用多態性或鑑別器來處理「現在什麼?」
- 類型前綴:更繁瑣一點來實現,但允許更大的靈活性,並具有零開銷上的TCP流
嗨,感謝您的詳細回覆。 我設法使用Serializer.SerializeWithLengthPrefix&Serializer.NonGeneric.TryDeserializeWithLengthPrefix 完成所需的結果我想使用RuntimeTypeModel來避免我的類有屬性。 Model.SerializeWithLengthPrefix似乎按預期工作,但我無法在RuntimeTypeModel上找到TryDeserializeWithLengthPrefix的等價性。 model.DeserializeWithLengthPrefix似乎期待一種類型。我應該如何使用模型完成TryDeserializeWithLengthPrefix的等價物。 使用版本2.0.0.480 nuget – 2012-02-03 10:18:40
我已更改我的代碼以添加以將模型定義添加到RuntimeTypeModel.Default,並且我可以使用TryDeserializeWithLengthPrefix沒有屬性。在我使用TypeModel創建新模型之前創建 所以問題解決了謝謝 – 2012-02-03 11:11:13
@Yavor on TypeModel,它只是DeserializeWithLengthPrefix和TypeResolver。不確定嘗試去了哪裏!我會在沙發上的墊子後面尋找它 - 這是大多數情況下的結果。 – 2012-02-03 13:51:20
一個典型的選擇是有包裝的消息充當「選項類型」或可識別聯合。您可以擁有一個枚舉(每個消息類型一個)和一個包含消息類型字段的消息,然後每個消息類型都有一個可選字段。
這在Protobuf文檔中描述爲"union type"。
你可以把它包像這樣。數據將保存實際的消息。
message MyCustomProtocol {
required int32 protocolVersion = 1;
required int32 messageType = 2;
bytes data = 3;
}
協議的一般規則是包含協議版本。一旦你有新老客戶,你會很高興擁有它。
- 1. 協議緩衝消息,並從XPathDocument的
- 2. C++類應該包含協議緩衝區消息還是從協議緩衝區消息構建/填充
- 3. 確定協議緩衝區消息類型的最佳實踐
- 4. Google協議緩衝區,如何處理多個消息類型?
- 5. Java協議緩衝區 - 消息大小
- 6. 損壞的協議緩衝區消息
- 7. 如何檢測協議緩衝區消息何時完全接收?
- 8. 使用RabbitMQ管理器排隊協議緩衝區消息
- 9. 序列化和發送協議緩衝器消息
- 10. 如何使用Gson從json構建協議緩衝區消息?
- 11. 從iOS發送C++協議緩衝區消息
- 12. 如何判斷序列化協議緩衝區中的消息類型?
- 13. 協議緩衝區 - 讀所有消息的公共消息頭(嵌套消息)
- 14. 協議緩衝區
- 15. 從c#到java的谷歌的協議緩衝區 - 協議消息標記有無效的線型
- 16. 從Java客戶端向C++服務器發送協議緩衝區消息
- 17. 協議緩衝區精簡版與常規協議緩衝區
- 18. 一個協議字段緩衝區作爲另一個協議緩衝區字段的消息
- 19. 可用性的在proto3協議緩衝器「熟知類型的」
- 20. 在協議緩衝區消息中存儲二進制數據緩衝區
- 21. 處理非常大的String消息的協議緩衝區?
- 22. 協議緩衝區c#(protobuf-net)消息::字節大小
- 23. 查看協議緩衝區消息文件
- 24. 谷歌協議緩衝區消息到字節數組C++(Windows)
- 25. 使用Google協議緩衝區多次反序列化消息
- 26. 協議緩衝無法解析具有消息
- 27. 顯示協議緩衝區消息中的所有元素
- 28. 協議緩衝區作爲消息過活動Mq
- 29. 通過Akka IO和套接字協議緩衝區消息
- 30. 擴展協議緩衝區
我只是使用多個端點。函數重載在編程語言中足夠笨重,在網絡服務中則少得多。 – millimoose 2012-02-02 23:32:25
謝謝,這是我的備份計劃:) – 2012-02-02 23:34:33