首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表的节俭(反)序列化

列表的节俭(反)序列化
EN

Stack Overflow用户
提问于 2014-07-09 09:48:21
回答 1查看 1.4K关注 0票数 2

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

更具体地说,假设我用节俭来定义

代码语言:javascript
复制
struct A {
    1: required long x;
    2: required long y;
}

我可以通过定义

代码语言:javascript
复制
struct ListOfA {
    1: required list<A> theList;
}

然后

代码语言:javascript
复制
ListOfA myList = ...
TSerializer serializer = new TSerializer();
byte[] mySerializedList = serializer.serialize(myList);

我的问题是,是否有可能避免只包含列表的额外结构(稍微不优雅)的定义。

以下内容无法工作,因为TSerializer.serialize需要一个TBase

代码语言:javascript
复制
List<A> myList = ...   // List<A> instead of ListOfA
TSerializer serializer = new TSerializer();
byte[] mySerializedList = serializer.serialize(myList); //does not compile

在IDL中使用ty胡枝子已经有帮助了,但它们似乎并没有被转换成Java类

代码语言:javascript
复制
typedef list<A> ListOfA

在生成的=>代码中没有定义ListOfA。

EN

回答 1

Stack Overflow用户

发布于 2014-07-09 13:05:02

我的问题是,是否有可能避免只包含列表的额外结构的(稍微不雅的)定义

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

节约允许任意数量的输入参数。但是,只能有一个返回值。不存在诸如varout参数或多个返回值之类的内容,因此您实际上只能返回一个返回值,才能返回需要返回的任何数据。

起作用的第二个方面是soft-versioning.。节约允许以后增强接口和数据结构,而不破坏旧的服务或客户端。如果你决定这么做

代码语言:javascript
复制
struct Bar { /*some data*/ }

service Foo {
    list<Bar> GiveMeTheData()
}

你基本上把自己和那个机制割断了。因为返回的list<Bar>不能用新的附加成员进行扩展。在这种情况下,您将不得不添加另一个调用。

相反,通过使用包装struct,扩展返回数据是很容易的,而且代价并不高:

代码语言:javascript
复制
struct Bar { /*some data*/ }

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

service Foo {
    FooResult GiveMeTheData()
}

此外,后者还允许返回一个空列表,这在第一个布局中是不可能的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24650390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档