gpt4 book ai didi

c++ - Thrift 必填字段 C++

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:01 24 4
gpt4 key购买 nike

Thrift File:
struct Sub {
1: required i32 number
}

struct Message {
1: required Sub sub
}

Message m;
m.write(protocol.get());
Message parsedM;
parsedM.read(protocol2.get());
std::cout << parsedM.sub.number;

SourceCode

Thrift 不应该引发错误,或者是否有任何其他可能正确检查是否已设置所有必填字段?否则,我认为该关键字没有任何实际意义。

最佳答案

简答

是的,如果反序列化时数据不存在,您应该得到一个TProtocolException::INVALID_DATA。在您的示例中情况并非如此,因此您不会遇到异常。

长答案

这是根据您的 IDL 生成的 C++ read() 方法之一。注意 isset_number 及其使用方式:

uint32_t Sub::read(::apache::thrift::protocol::TProtocol* iprot) {

uint32_t xfer = 0;
std::string fname;
::apache::thrift::protocol::TType ftype;
int16_t fid;

xfer += iprot->readStructBegin(fname);

using ::apache::thrift::protocol::TProtocolException;

bool isset_number = false;

while (true)
{
xfer += iprot->readFieldBegin(fname, ftype, fid);
if (ftype == ::apache::thrift::protocol::T_STOP) {
break;
}
switch (fid)
{
case 1:
if (ftype == ::apache::thrift::protocol::T_I32) {
xfer += iprot->readI32(this->number);
isset_number = true;
} else {
xfer += iprot->skip(ftype);
}
break;
default:
xfer += iprot->skip(ftype);
break;
}
xfer += iprot->readFieldEnd();
}

xfer += iprot->readStructEnd();

if (!isset_number)
throw TProtocolException(TProtocolException::INVALID_DATA);
return xfer;
}

那么为什么它在您的示例中有效?

正如我们所见,required 字段预计会出现在反序列化数据中,而 optional(和默认)字段可能会丢失。但是标记为required 的字段(和默认字段)也总是写入 到传输中,可选 只有在分配了值时。因此,您读取了之前序列化的数据:

uint32_t Sub::write(::apache::thrift::protocol::TProtocol* oprot) const {
uint32_t xfer = 0;
xfer += oprot->writeStructBegin("Sub");

xfer += oprot->writeFieldBegin("number", ::apache::thrift::protocol::T_I32, 1);
xfer += oprot->writeI32(this->number);
xfer += oprot->writeFieldEnd();

xfer += oprot->writeFieldStop();
xfer += oprot->writeStructEnd();
return xfer;
}

请注意,Thrift 不关心该字段是否包含有效 数据。这都是关于序列化方面的。

推荐阅读

Diwaker Gupta's "Missing Guide"很好地解释了 required 的优缺点。

关于c++ - Thrift 必填字段 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21281376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com