簡體   English   中英

如何使用協議緩沖區的擴展來維護“一般”消息

[英]how to use extensions from protocol buffers to maintain 'general' message

我的客戶端-服務器通信看起來像這樣:有一些所謂的公告是用於交換信息的單獨消息。 這個想法是公告是每條消息的共同部分。 實際上我想這將是消息的類型。 類型決定內容是什么。 在 UML class 圖中,公告將是 class 所有其他消息繼承。

我想在兩個應用程序之間的通信中實現這個想法,一個用 C++ 編寫,另一個用 C# 編寫。 我想我可以寫一條消息,其中包含一個字段,如果消息(枚舉字段)的類型。 所有與類型相關的附加信息都將作為擴展來實現。

我找到了一些如何在 C++ 中使用擴展的示例,但是我不知道如何在 C# 中使用擴展。 我知道有接口 IExtensible 和 IExtension(在 protobuf-net 中),但我該如何使用它們呢? 互聯網資源似乎在這件事上很窮。

我想過去 C# 中的消息的定義類似於時尚,它們仍然在 C++ 應用程序中定義(使用 proto 文件和 protoc)。 我可以使用相同的 proto 文件來定義 C# 中的消息嗎? 如何? 擴展是否會被解釋或覆蓋?

如果我可以實現擴展,我會發送一條消息,解析它,檢查類型並使用適當的 function 來維護它。 這對我來說聽起來很酷,因為我不必關心我要閱讀的消息的類型——我不必在解析之前知道類型。

有很多方法可以做到這一點。 實際上不確定擴展是我想要的擴展,但是:

在您的消息類型中,您可以為每個子消息設置一組完全定義的字段,即

base-message
  {1-5} common fields
  {optional 20} sub-message 1
  {optional 21} sub-message 2
  {optional 22} sub-message 3
  {optional 23} sub-message 4
sub-message 1
  {1-n} specific fields

您將在其中恰好有一個子消息 object

或者,將公共部分封裝在更具體的消息中:

common field type
  {1-n} fields
sub-message 1
  {1} common field type
  {2-m} specific fields

任何一種方法都可以讓您反序列化; 第二個比較棘手,IMO,因為它需要你提前知道類型。 唯一方便的方法是為每個前綴添加不同的標識符。 個人更喜歡第一種。 然而,這並不需要擴展——因為我們提前知道了一切。 碰巧,第一個也是 protobuf-net 如何實現 inheritance,因此您可以使用 inheritance 類型(抽象基本消息類型的 4 個具體子類型)和[ProtoInclude(...)]

重新擴展數據; protobuf-net確實支持這一點,但是正如博客中提到的,這不包含在當前的 v2 測試版中。 它很快就會出現,但我不得不在某處放置一條線。 它包含在 v1 (r282) 下載中

請注意,protobuf-net 只是幾個 C#/.NET 實現之一。 有線格式是相同的,但您可能還需要考慮直接移植版本 如果我必須總結差異,我會說“protobuf-net 是一個 .NET 序列化程序,恰好是 protobuf;protobuf-csharp-port 是一個恰好是 .NET 的 protobuf 序列化程序”——它們都達到了相同的目的,但是 protobuf -net 側重於 C#/.NET 的慣用語,而端口更側重於具有相同的 API。 當然,任何一個都應該在這里工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM