thrift/swift:ThriftMethodProcessor代码分析
发布时间:2020-12-14 06:00:15 所属栏目:百科 来源:网络整理
导读:thrift是一种跨语言的RPC框架,为了保证在各种语言下都能正确表述,IDL语言在设计的时候就只能选取各种语言的共性。 比如对于null,虽然在java中定义一个字段为Integer类型,那么这个字段就可以为null,但thrift不允许primitive类型的数据字段为null,因为在c/c
thrift是一种跨语言的RPC框架,为了保证在各种语言下都能正确表述,IDL语言在设计的时候就只能选取各种语言的共性。 经过反复跟踪我总算找到将null参数转为0的位置,就在服务端 private Object[] readArguments(TProtocol in)
throws Exception
{
try {
int numArgs = method.getParameterTypes().length;
// 初始化参数数组,初始值都为null
Object[] args = new Object[numArgs];
TProtocolReader reader = new TProtocolReader(in);
// 先从收到的数据库根据fieldId 将不为null的服务方法参数解析出来,
// 为null的参数不在收到的数据中出现
// 所以这个循环结束时,不为null的参数已经被正确解析并保存到args的对应位置了
// client填null(原本就是null)的参数对应的位置就是null,
reader.readStructBegin();
while (reader.nextField()) {
short fieldId = reader.getFieldId();
ThriftCodec<?> codec = parameterCodecs.get(fieldId);
if (codec == null) {
// unknown field
reader.skipFieldData();
}
else {
// 将参数调用对应用的解码器ThriftCodec解析成正确的数据类型,
// 存入arg数组对应的位置
args[thriftParameterIdToJavaArgumentListPositionMap.get(fieldId)] = reader.readField(codec);
}
}
reader.readStructEnd();
// 在下面这个循环中,对args数组中为null的参数进行检查,
// 如果是primitive类型则调用 Defaults.defaultValue方法返回缺省值
// 比如对于Integer类型缺省值就是0
int argumentPosition = 0;
for (ThriftFieldMetadata argument : parameters) {
if (args[argumentPosition] == null) {
Type argumentType = argument.getThriftType().getJavaType();
if (argumentType instanceof Class) {
Class<?> argumentClass = (Class<?>) argumentType;
argumentClass = Primitives.unwrap(argumentClass);
args[argumentPosition] = Defaults.defaultValue(argumentClass);
}
}
argumentPosition++;
}
return args;
}
catch (TProtocolException e) {
// TProtocolException is the only recoverable exception
// Other exceptions may have left the input stream in corrupted state so we must
// tear down the socket.
throw new TApplicationException(TApplicationException.PROTOCOL_ERROR,e.getMessage());
}
} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ajax 读取json数据
- Swift语法基础:17 - Swift的For循环, While, Do-While, If
- c# – DataGridView ComboBox EditingControlShowing事件
- 如何应用JsonConfig解决There is a cycle in the hierarchy
- ruby-on-rails – Rails路由url名称助手
- c# – 如何更改foreach迭代器引用的原始数据类型变量的值
- objective-c – readonly属性总是“原子”吗?
- 如何使用Open XML和C#更改单个段落或页面的方向?
- 不依赖xinetd的方式运行nrpe
- 在FlashBuilder下新建或导入项目时提示未安装asp.net devel