thrift如何定义Java中的object类型
生活随笔
收集整理的這篇文章主要介紹了
thrift如何定义Java中的object类型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 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方法獲取,對應的類型
或者,通過對應類型的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時
生成后,會變成ByteBuffer類型,根據需要的類型對應進行轉換即可。
public List<ByteBuffer> myList;終極方法:序列化
終極方案當然還是先把包含Object類型的對象或者集合,先序列化成一個jsonString。此時,在thrift中定義成string即可。使用時,由調用端將這個string對象根據約定的對象反序列化后既可獲得需要的類型。
以下面的接口為例,通過Jackson序列化。
服務端序列化:
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类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 12 网页版HTML源码
- 下一篇: Java加密算法---SHA