我有一个登录表格,其中输入了登录信息。当我开始输入时,文本立即发送到服务器,在那里检查登录是否可用。
答案必须是0或1,真或假,取决于我产生进一步的行动。 但是0 / false是默认字段值,并且它们不被发送,字段只是保持为空,字段根本不存在(当且仅当字段不等于其默认值时,才会在线路上发送字段)。
我该怎么办?我明确需要得到一个0或1的答案。当然,我使用一个字符串,但这是错误的。
.proto
message InputChecking {
string login = 1;
int32 loginStatus = 2;
string mail = 3;
int32 mailStatus = 4;
}
message RegistrationRequest {
...
}
message WrapperMessage {
oneof msg {
InputChecking mes_inputChecking = 1;
RegistrationRequest mes_registrationRequest = 2;
}
}
的.cpp
WrapperMessage wm; // protobuf message, is filled with data from the server
const google::protobuf::FieldDescriptor* inputCheckingField = wm.GetDescriptor()->FindFieldByName("mes_inputChecking");
if (wm.GetReflection()->HasField(wm, inputCheckingField)) // if inputCheckingField is
{
// It says that such a field is, when he receives a message from the server with loginStatus = 0, but there are no fields
const google::protobuf::FieldDescriptor* loginStatusField = wm.mes_inputchecking().GetDescriptor()->FindFieldByName("loginStatus");
if (wm.mes_inputchecking().GetReflection()->HasField(wm.mes_inputchecking(), loginStatusField))
{
// It is only called when the login is different from 0
Log("Login status = " + wm.mes_inputchecking().loginstatus());
}
}
答案 0 :(得分:0)
在阅读this thread之后,我找到了一种处理可空/默认字段的方法,其中包含一个包装器。
message Foo {
int x = 1;
oneof v1 {
int32 value1 = 2;
bool value2 = 3;
}
}
答案 1 :(得分:0)
另一种选择是使用枚举:
enum LoginStatus {
LOGINSTATUS_INVALID = 0,
LOGINSTATUS_NOT_AVAILABLE = 1,
LOGINSTATUS_AVAILABLE = 2
}
这两者都使代码更具可读性,并允许单独处理第三个状态(响应中缺少字段)。