2010-08-09 31 views
3

我正在尋找一種將協議緩衝區中的重複字段的序列化的值(字節[])添加到協議緩衝區信息。將原始序列化的值添加到協議緩衝區中的重複字段(protobuf-net,protobuf-csharp)

我有一個應用程序,它將數據項以序列化的形式保存在memcached中,並且需要將它們傳送到遠程客戶端。客戶端通過提供密鑰列表來請求數據項目,並且服務器發回數據項目列表。數據項的內容對於服務器並不重要;它不需要知道它們包含什麼,它只需要知道它們的關鍵。

當前的方法是從memcached中獲取項目,將它們反序列化,將它們添加到響應中的數據項列表中,將響應序列化爲字節數組並通過套接字發送。這不是最優的,因爲我們反序列化數據項目只是讓它們在下一步中再次序列化。這兩個序列化(用於memcached和輸出)都使用協議緩衝區完成。理想情況下,我們可以在從memcached中獲取數據之後跳過反序列化,並將序列化值添加到響應中。我看着protobuf-net和protobuf-csharp,並沒有找到一種方法來實現這一點。可能嗎?我忽略了什麼?

這裏是原定義(簡體):

message Request {  
    required int32 messageId; 
    repeated string keys; 
} 

message DataItem { 

    required string key = 1; 
    required ValueType type = 2;  // the type of the value, enumeration 

    optional int32 intValue = 3; 
    optional int64 longValue = 4; 
    optional double doubleValue = 5; 
    optional float floatValue = 6; 
    optional bool boolValue = 7; 
    optional string stringValue = 8; 
} 

message Response { 
    required int32 messageId; 
    repeated DataItem dataItems; 
} 

回答

1

好了,bytes字段類型呈現不透明的二進制數據是......你在找什麼?請注意,爲了不變性目的(無論如何protobuf-csharp),這些值都表示爲不可變的ByteString值 - 但您可以將這些消息從一個消息複製到另一個消息而不需要複製實際數據(即對同一個blob保留單個引用在兩條消息中)。

+0

在這種情況下,我必須用'bytes'替換ResponseItem中的DataItem,並將它留給客戶端來將這些字節解釋爲DataItem對象。我一直在尋找一種能夠保持類型安全的解決方案,並且仍然允許以序列化(二進制)形式添加對象。 – 2010-08-09 08:43:25

+0

@Boris:我不相信我在任何protobuf庫中都看到過這樣做。 – 2010-08-09 08:52:37

+0

嗯,我猜這太好了,不能成立;)感謝您的及時答覆喬恩! – 2010-08-09 08:54:23

0

您可以添加一個訊息給你的protobuf:

message RawResponse { 
    required int32 messageId; 
    repeated bytes dataItems; 
} 

然後,做以下操作:

  1. 取memcached的項目直接進入RawResponse
  2. 發送RawResponse回
  3. 在客戶端反序列化爲響應

這種方法可行,因爲RawResponse和Response都具有相同的二進制表示形式。 [1]

相關問題