3

オブジェクトのシリアライズされた値 (byte[]) をプロトコル バッファ メッセージの繰り返しフィールドに追加する方法を探しています。

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;
}
4

2 に答える 2

1

さて、bytesフィールド タイプは不透明なバイナリ データを表します...それはあなたが探しているものですか? 不変性の目的で (とにかく protobuf-csharp で)、これらは不変のByteString値として表されることに注意してください。 2 つのメッセージ)。

于 2010-08-09T08:30:54.883 に答える
0

protobuf にもう 1 つのメッセージを追加できます。

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

次に、次の操作を行います。

  1. memcached アイテムを RawResponse に直接フェッチする
  2. RawResponse を返送する
  3. クライアントで、Response にデシリアライズします

RawResponse と Response の両方が同じバイナリ表現を持つため、このアプローチは機能します。[ 1 ]

于 2017-07-05T20:58:32.933 に答える