目录

  • thrift如何定义Java中的Object类型
    • 方法一:使用联合(union)
    • 方法二:使用特殊类型(binary)
    • 终极方法:序列化

thrift如何定义Java中的Object类型

由于thrift的类型没有类似java的Object类型,当我们想用thrift来定义一个具体类型不确定的对象时候,会有不知如何定义的困扰。

方法一:使用联合(union)

union的特点是结构中的每个field之间的关系是互斥的,即只能有一个field被使用被赋值。所以可以根据我们未知类型对象的类型范围定义一个union

union JavaObjectArg {1: i32 int_arg;2: i64 long_arg;3: string string_arg;4: bool bool_arg;5: binary binary_arg;6: double double_arg;
}struct OneResp {1: list<JavaObjectArg> myList,
}

union的使用方式
可以通过生成的JavaObjectArg.java中的standardSchemeReadValue方法获取,对应的类型

protected Object standardSchemeReadValue(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TField field) throws org.apache.thrift.TException

或者,通过对应类型的get方法获得结果。例如获取int类型的结果

 public int getInt_arg() {if (getSetField() == _Fields.INT_ARG) {return (Integer)getFieldValue();} else {throw new RuntimeException("Cannot get field 'int_arg' because union is currently set to " + getFieldDesc(getSetField()).name);}}

方法二:使用特殊类型(binary)

binary:是未编码的字节序列
类似,当我们想定义一个List时

struct TwoResp {1: list<binary> myList,
}

生成后,会变成ByteBuffer类型,根据需要的类型对应进行转换即可。

 public List<ByteBuffer> myList;

终极方法:序列化

终极方案当然还是先把包含Object类型的对象或者集合,先序列化成一个jsonString。此时,在thrift中定义成string即可。使用时,由调用端将这个string对象根据约定的对象反序列化后既可获得需要的类型。
以下面的接口为例,通过Jackson序列化。

service ITMuouThriftService {string testScene(string param);
}

服务端序列化:

Map<String, Object> decisionMap = Maps.newHashMapWithExpectedSize(1);
decisionMap.put("res": 1);
return new ObjectMapper().writeValueAsString(decisionMap)

调用端反序列化:

TypeReference<Map<String, Object>> MAP_TYPE_REF = new TypeReference<Map<String, Object>>() { };
String res = muouThriftService.testScene("test");
Map<String, Object> resultMap = new ObjectMapper().readValue(res, MAP_TYPE_REF);

git地址:

thrift如何定义Java中的object类型相关推荐

  1. java中的null类型---有关null的9件事

    摘自 https://blog.csdn.net/qq_25077777/article/details/80174763 今天听到一个问题,java中的null类型,null竟然是一种类型 java ...

  2. Java中的对象类型像引用还是指针,谁是谁非?

    Java中的对象类型像引用还是指针,谁是谁非? 作者:海枫 地址:http://blog.csdn.net/linyt 作为一名程序员,我们应该对新知识和新技术刨根问底,而不应泛泛而谈.我未曾接触到J ...

  3. Java中,一切皆是对象——java中的对象类型与基本数据类型的区别

    起因:取一个list给另一个list赋值,然后在另一个list中取出进行修改.list其中类型为对象时,String时,基本数据类型时. [java中的对象类型与基本数据类型的区别] #声明和实例化 ...

  4. byte java byte_详解java中的byte类型

    Java中整数类型有:byte占8位, short 占16位, int占32位, long占64位 Java也提供了一个byte数据类型,并且是基本类型中的整数类型.java byte是作为最小的数字 ...

  5. 在Java中确定文件类型

    以编程方式确定文件的类型可能非常棘手,并且已经提出并实现了许多基于内容的文件标识方法. Java中有几种可用于检测文件类型的实现,其中大多数很大程度上或完全基于文件的扩展名. 这篇文章介绍了Java中 ...

  6. byte java 详解_详解java中的byte类型

    Java也提供了一个byte数据类型,并且是基本类型.java byte是做为最小的数字来处理的,因此它的值域被定义为-128~127,也就是signed byte.下面这篇文章主要给大家介绍了关于j ...

  7. mysql数据库 布尔类型_MySql数据库类型bit等与JAVA中的对应类型【布尔类型怎么存】...

    用char(1):可以表示字符或者数字,但是不能直接计算同列的值.存储消耗1个字节 用tinyint:只能表示数字,可以直接计算,存储消耗2个字节 用bit: 只能表示0或1,不能计算,存储消耗小于等 ...

  8. Java中的byte类型是有符号的吗_JAVA中byte类型的介绍。 谢谢

    展开全部 Java也提供62616964757a686964616fe59b9ee7ad9431333431366265了一个byte数据类型,并且是基本类型.java byte是做为最小的数字来处理 ...

  9. Java中的原始类型与原始封装类型

    在写Java代码的过程中,一直对Java提供的一些类参数又疑问,今天查了一下,进行了解学习. type argument cannot be of primitive type 问题: Java中什么 ...

最新文章

  1. 传统制造业面临大数据的7种改变方式
  2. eureka java_spring cloud 入门系列二:使用Eureka 进行服务治理
  3. linux_unix系统编程手册源代码编译
  4. 数论 - 算数基本定理的运用 --- nefu 118 : n!后面有多少个0
  5. 电脑:分享八个实用的电脑技巧,小白必备!
  6. python神经网络调节参数_神经网络进阶-用python实现一个完整的神经网络框架并在CIFAR10数据集上调参...
  7. 纯CSS菜单样式,及其Shadow DOM,Json接口 实现
  8. centos 减少tty数量的方法
  9. 如何加入微服务 Apache ServiceComb 社区
  10. 5.Django|模型层--多表关系
  11. vue获取路径参数和请求参数
  12. [读书]看看你有没有忽视
  13. oracle查询特殊字符-escape
  14. 2952 细胞分裂 2
  15. js制作网页动态背景
  16. 智能科学与技术是不是属于计算机专业,智能科学与技术专业属于什么类别
  17. 三点布光材质连接,做旧
  18. 常见问题汇总:FLUENT面数据处理
  19. 栈的压入、弹出序列(Java)
  20. 【公式编辑测试】解析几何-三角形外心重心垂心内心公式

热门文章

  1. ABAQUS 工程仿真分析视频教程
  2. JavaEE_day_25_Lambda、SteamAPI
  3. Go 实现希尔排序算法及图解
  4. 智慧病房解决方案(全)
  5. 劳务派遣信息管理系统软件是什么,教你了解劳务派遣管理系统!
  6. 基于调度算法的柔性车间问题的研究
  7. 微信小程序关于内层view设置margin-top无效的解决方案
  8. 云豹直播app源码对fragment替换方案的思考
  9. Android悬浮窗开启 适配所有机型(附源码)
  10. 现代软件工程第一次作业-团队介绍