thrift如何定义Java中的object类型
目錄
- thrift如何定義Java中的Object類型
- 方法一:使用聯(lián)合(union)
- 方法二:使用特殊類型(binary)
- 終極方法:序列化
thrift如何定義Java中的Object類型
由于thrift的類型沒有類似java的Object類型,當(dāng)我們想用thrift來定義一個具體類型不確定的對象時候,會有不知如何定義的困擾。
方法一:使用聯(lián)合(union)
union的特點是結(jié)構(gòu)中的每個field之間的關(guān)系是互斥的,即只能有一個field被使用被賦值。所以可以根據(jù)我們未知類型對象的類型范圍定義一個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方法獲取,對應(yīng)的類型
或者,通過對應(yīng)類型的get方法獲得結(jié)果。例如獲取int類型的結(jié)果
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:是未編碼的字節(jié)序列
類似,當(dāng)我們想定義一個List時
生成后,會變成ByteBuffer類型,根據(jù)需要的類型對應(yīng)進(jìn)行轉(zhuǎn)換即可。
public List<ByteBuffer> myList;終極方法:序列化
終極方案當(dāng)然還是先把包含Object類型的對象或者集合,先序列化成一個jsonString。此時,在thrift中定義成string即可。使用時,由調(diào)用端將這個string對象根據(jù)約定的對象反序列化后既可獲得需要的類型。
以下面的接口為例,通過Jackson序列化。
服務(wù)端序列化:
Map<String, Object> decisionMap = Maps.newHashMapWithExpectedSize(1); decisionMap.put("res": 1); return new ObjectMapper().writeValueAsString(decisionMap)調(diào)用端反序列化:
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地址:
總結(jié)
以上是生活随笔為你收集整理的thrift如何定义Java中的object类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 12 网页版HTML源码
- 下一篇: HttpWebRequest FileS