我們以顧客下單買車為例子,來深入了解下Thrift的一些細(xì)節(jié)
1.自定義標(biāo)識符VS自動標(biāo)識符
2.Optional VS Required VS Default
3.struct的組合(struct不支持繼承)
首先是Thrift文件定義如下:
namespace java com.whp.demo.thrift.optional
struct Car {
1:required i32 carId,
2:required string carName,
3:required i64 price,
4: optional i16 age=0
}
struct Consumer{
1:required i32 consumerId,
2:optional string name
}
struct Order{
required i64 orderId,
required Car car,
required Consumer consumer,
}
service CarService{
Order createBuyCarOder(1:required Car car, 2:required Consumer consumer)
}
include "other.thrift"? ? ? //包含其它的thrift文件
namespace java com.whp.demo? ?//java下的namespace com.whp.demo
typedef i32 int;? ?//tydef 語法
typedef i64 long;
enum Player {
? ? JAVA = 0;
? ? FLASH = 1;
}
Required VS Opetional
#required:一定會被序列號躺坟,并且如果沒有被復(fù)制属桦,將會被提醒
#optional:如果沒有被賦值熊痴,將不會被序列化。如果有默認(rèn)值聂宾,則將會被序列化成默認(rèn)值果善。具有一定的向后兼容性。
#default: 默認(rèn)情況下是 req-in系谐,opt-out即 對于write stream默認(rèn)是required巾陕,對于read stream是optional
整數(shù)編號
#如果一個程序分開來開發(fā)讨跟,那版本問題就是繞不過去的問題。Thrift的版本是通過“field identifiers”來實現(xiàn)的鄙煤,每個結(jié)構(gòu)由其標(biāo)識晾匠,結(jié)構(gòu)中的每個域有其標(biāo)識,這兩個標(biāo)識唯一決定了一個數(shù)據(jù)域梯刚。在解碼的時候凉馆,數(shù)據(jù)域的標(biāo)識被檢查,如果不能識別亡资,則該數(shù)據(jù)域被拋棄.
用戶自定義編號是從1開始的正整數(shù)
默認(rèn)編號是從-1 開始遞減澜共。
struct Order{
required i64 orderId,
required Car car,
required Consumer consumer,
}
比如這個,編譯后會成為:
ORDER_ID((short)-1,"orderId"),
CAR((short)-2,"car"),
CONSUMER((short)-3,"consumer");
Struct組合
struct Order{
required i64 orderId,
required Car car,
required Consumer consumer,
}
我們可以直接在Order中組合Car和Consumer