オブジェクトをプロトコル バッファに変換するときに、ShouldSerialize* メソッドと *Specified メソッドの両方が無視されます。
-p:detectMissing
フラグを使用して生成された次のリクエストがあるとします。
message RpbIndexReq {
enum IndexQueryType {
eq = 0;
range = 1;
}
required bytes bucket = 1;
required bytes index = 2;
required IndexQueryType qtype = 3;
optional bytes key = 4; // key here means equals value for index?
optional bytes range_min = 5;
optional bytes range_max = 6;
optional bool return_terms = 7;
optional bool stream = 8;
optional uint32 max_results = 9;
optional bytes continuation = 10;
}
max_results
0 に初期化され、ネットワーク経由で送信されます。
RpbIndexReq は次のように生成されます。
private RiakResult<IList<string>> IndexGetRange(string bucket, string indexName, string minValue, string maxValue, RiakIndexGetOptions options = null)
{
var message = new RpbIndexReq
{
bucket = bucket.ToRiakString(),
index = indexName.ToRiakString(),
qtype = RpbIndexReq.IndexQueryType.range,
range_min = minValue.ToRiakString(),
range_max = maxValue.ToRiakString()
};
options = options ?? new RiakIndexGetOptions();
options.Populate(message);
/* at this point, message.max_results is 0 */
var result = UseConnection(conn => conn.PbcWriteRead<RpbIndexReq, RpbIndexResp>(message));
if (result.IsSuccess)
{
return RiakResult<IList<string>>.Success(result.Value.keys.Select(k => k.FromRiakString()).ToList());
}
return RiakResult<IList<string>>.Error(result.ResultCode, result.ErrorMessage, result.NodeOffline);
}
RpbIndexReq
オブジェクトには以下が含まれます。
private uint? _max_results;
[global::ProtoBuf.ProtoMember(9, IsRequired = false, Name=@"max_results", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
public uint max_results
{
get { return _max_results?? default(uint); }
set { _max_results = value; }
}
[global::System.Xml.Serialization.XmlIgnore]
[global::System.ComponentModel.Browsable(false)]
public bool max_resultsSpecified
{
get { return _max_results != null; }
set { if (value == (_max_results== null)) _max_results = value ? max_results : (uint?)null; }
}
private bool ShouldSerializemax_results() { return max_resultsSpecified; }
private void Resetmax_results() { max_resultsSpecified = false; }
max_results
は auint
であり、notであるためuint?
、protobuf 定義でオプションとして指定されているにもかかわらず、常に 0 に設定されます。
これは期待される結果ですか?RpbIndexReq メッセージを生成して、必要に応じてヌル値が送信されるようにする別の方法はありますか?