繁体   English   中英

列表的节俭(反序列化)

[英]Thrift (de)serialization of list

在Thrift中,在对服务进行方法调用的上下文中,列表可以直接用作参数或返回类型。 如果您需要显式的对象(反序列化),是否有一种便捷的方法(在Java中)使用Thrift来对List <TBase>进行序列化(序列化),而不必将其包装为Thrift IDL中的单独结构?

更具体地讲,假设我已经节俭地定义了

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

我可以通过定义来反序列化这些列表

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

=>在生成的Java代码中未定义ListOfA。

我的问题是是否有可能避免仅包含列表的额外结构的这种定义(略微不足道)

我建议相反:执行使用包装结构的“低效”步骤。

节俭允许任意数量的输入参数。 但是, 只能有一个返回值 没有诸如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()
}

此外,后者还允许返回NULL列表,这对于第一种布局是不可能的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM