在the中,在服务上的方法调用上下文中,列表可以直接用作参数或返回类型。如果您需要显式对象(De)序列化,那么是否有一种方便的方法(在Java中)使用List< TBase >来序列化一个TBase>,而不必将它包装成一个单独的结构?
更具体地说,假设我用节俭来定义
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中使用ty胡枝子已经有帮助了,但它们似乎并没有被转换成Java类
typedef list<A> ListOfA在生成的=>代码中没有定义ListOfA。
发布于 2014-07-09 13:05:02
我的问题是,是否有可能避免只包含列表的额外结构的(稍微不雅的)定义
我建议采取相反的方法:执行使用包装结构的“低效”步骤。
节约允许任意数量的输入参数。但是,只能有一个返回值。不存在诸如var或out参数或多个返回值之类的内容,因此您实际上只能返回一个返回值,才能返回需要返回的任何数据。
起作用的第二个方面是soft-versioning.。节约允许以后增强接口和数据结构,而不破坏旧的服务或客户端。如果你决定这么做
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()
}此外,后者还允许返回一个空列表,这在第一个布局中是不可能的。
https://stackoverflow.com/questions/24650390
复制相似问题