1

解決済み: リストに単一の SerialKey を追加しようとしました。SerialKeyList に 1 つのキーを追加すると、正常に機能します。

要素のリストとブラックリストに登録された要素のリストで構成されるリストをキャッシュに保存するために、libmemcached および Google プロトコル バッファと共に memcached を使用しています。

.proto は次のとおりです。

message SerialKeyList {
repeated SerialBlackKey bkey = 2;
repeated SerialKey key = 1;
}

message SerialKey {
optional string key = 1;
}

message SerialBlackKey {
optional string key = 2;
}

memcached_append() を使用して、SerialKey または SerialBlackKey のいずれかのタイプの単一要素を追加したいと考えています。1 つの SerialKey 要素 (memcached_set(SerialKeyList) を使用) でリストを初期化し、1 つの SerialBlackKey 要素を (memcached_append を使用して) 追加します。

memcached からリストを解析し、PrintDebugString() で印刷するときに得られる結果は次のとおりです。

key {
  key: "REPL:http://a.host.com/replica" 
}
bkey {
  10: "PL:http://a.host.com/replica" 
}

したがって、2 つのリストが作成されますが、2 番目の要素が正しく読み取られません。

それは可能であるべきですか?Protobuf エンコーディングのドキュメントから、繰り返されるフィールドが別のフィールドに続く必要がないことを理解しているため、他のタイプのフィールドをインターリーブできるはずです。

/編集: リスト内の 1 つのタイプの要素 (SerialKey) のみで同じ問題が発生します。ここでは、SerialKey の追加の属性を使用して、ブラックリストに含まれているかどうかを判断します。原文:

message SerialKeyList {
  repeated SerialKey key = 1;
}

message SerialKey {
  required string key = 1;
  required bool white = 2 [default = true];
}
4

1 に答える 1

0

あなたは正しいです-仕様では、特にこの追加シナリオをサポートするために、実装はフィールドを任意の順序で許可する必要があると述べています。

追加の鍵は、SerialKeyList に単一の SerialKey または SerialBlackKey を追加したとしても、SerialKeyList のように見える必要があるということです。

また、注: 文字列バージョンを使用している場合に追加が機能するかどうかはわかりませんが、バイナリ バージョンは確かに追加可能です。

より具体的な答えを得るには、おそらくこれをどのように構築しているかを示し、どの実装を使用しているかを述べる必要があります。

于 2012-03-19T16:51:34.233 に答える