2014-07-09 110 views
1

在Thrift中,在一個服務方法調用的上下文中,列表可以直接用作參數或返回類型。如果你需要明確的對象(反)序列化,有沒有一種方便的方法(在Java中)使用Thrift來(序列化)一個列表而不必將它作爲一個單獨的結構體包裝在節儉的IDL中?列表的二進制(反)序列化

更具體地說,假設我在舊貨定義

struct A { 
    1: required long x; 
    2: required long y; 
} 

我能(DE)通過定義

struct ListOfA { 
    1: required list<A> theList; 
} 

然後

ListOfA myList = ... 
TSerializer serializer = new TSerializer(); 
byte[] mySerializedList = serializer.serialize(myList); 

我的問題序列化的這些名單是否可以避免這個(稍微不雅觀的)額外結構的定義來僅包含這個名單。

下列不作爲TSerializer.serialize工作需要一個TBASE

List<A> myList = ... // List<A> instead of ListOfA 
TSerializer serializer = new TSerializer(); 
byte[] mySerializedList = serializer.serialize(myList); //does not compile 

使用的IDL一個typedef將已經幫助但這些都沒有轉化爲一個Java類似乎

typedef list<A> ListOfA 

=> ListOfA未在生成的Java代碼中定義。

+0

如果您認爲您發現了一個錯誤,您可以自由提交包含測試用例的JIRA票證。 – JensG

回答

1

我的問題是,是否有可能避免額外的結構的本(略不雅)定義只包含列表

我會建議相反:做使用的「低效率」的步驟包裝結構。

Thrift允許任意數量的輸入參數。但是,可以有只有一個返回值。有沒有這樣的事情varout參數,或多個返回值,因此,你真的只限於一個返回值的最大值,以返回您需要返回的任何數據。

進場的第二個方面是軟版本。 Thrift允許稍後增強接口和數據結構,而不會破壞舊的服務或客戶端。如果你決定這樣做

struct Bar { /*some data*/ } 

service Foo { 
    list<Bar> GiveMeTheData() 
} 

你基本上把自己從這個機制中解放出來。因爲返回的list<Bar>無法使用新增加的成員進行擴展。在這種情況下,您將不得不添加另一個電話。

相比之下,通過使用包裝struct,延長返回的數據是容易實現,而需要付出的代價並不高:

struct Bar { /*some data*/ } 

struct FooResult { 
    1: list<Bar> list 
    // new members here 
} 

service Foo { 
    FooResult GiveMeTheData() 
} 

Futhermore,後者也允許返回NULL列表,這對於第一個佈局來說是不可能的。

相關問題