AutoBean、数组/列表属性和 JSNI

Posted

技术标签:

【中文标题】AutoBean、数组/列表属性和 JSNI【英文标题】:AutoBean, Arrays/Lists properties and JSNI 【发布时间】:2012-05-31 12:53:35 【问题描述】:

我在 Autobeans 的上下文中不知何故在处理数组和 JSNI。 在我的一个 GWT 项目中,我使用 JSON 从后端检索数据。 在客户端上检索到数据后,我想使用自定义可视化小部件(用 javascript 开发)对其进行可视化。

以下是组件:

JSON 结构

'ids':[1,2,3,4],'data':[[1.0],[1.0,2.0],[1.0,2.0,3.0] ... ]

基本上,我的 json 有效负载中有两个数据集。 ids 是整数数组 (int[]),data 是浮点数组 (float[][])

当然有不同的方法来解析客户端上的数据。我决定使用 AutoBeans。所以我为我的 json 结构定义了一个接口。

AutoBean

interface MyData 
   List<Integer> ids;
   List<List<Float>> data;

解析数据工作正常。

我的自定义可视化小部件有一个 API 函数来设置如下所示的数据:

function api_setData(ids,data) 
   //ids should be an Array of Ints
   //data should be an array of array of Floats.

问题是我不能使用 JSNI 来使用普通的 Java 数组。我必须使用JsArray

public final native void setData(JsArrayInteger ids,JsArray<JsArrayInteger> data /*-
       this.api_setData(ids,data);
    -*/;

所以我必须将我的 AutoBean 属性(dataids)转换为 JsArray 实例。 有没有更好/更好的方法来做到这一点?

或者我应该使用JSONParser 而不是AutoBeans 这样更有效率吗?

【问题讨论】:

【参考方案1】:

如果您必须处理 JSNI,而且如果您仅在客户端使用 MyData 接口,则不要使用 AutoBeans。改用 JSON 覆盖:

public class MyData extends JavaScriptObject 
   protected MyData()  /* required for JSOs */ 

   public final native JsArrayInteger getIds() /*- return this.ids; -*/;

   public final native JsArray<JsArrayNumber> getData() /*- return this.data; -*/;

然后解析你的 JSON:

MyData data = JsonUtils.safeEval(jsonStr);
customVisualizationWidget.setData(data.getIds(), data.getData());

或者,假设您只需要为 setData 解析数据,那么只需使用 JavaScriptObject

在您的小部件中:

public final native void setData(JavaScriptObject obj) /*-
   this.api_setData(obj.ids, obj.data);
-*/;

当您需要解析 JSON 并将其提供给小部件时:

customVisualizationWidget.setData(JsonUtils.safeParse(jsonStr));

【讨论】:

感谢托马斯的反馈。我怀疑 AutoBean 可能不是最适合我的用例。我猜从性能的角度来看,JSO 和 AutoBean 应该同样快(我的数据数组可能有 200k 浮点值)。 JSO 的性能总是比 AutoBeans 好,因为 AutoBeans 有 JSO 的包装器。虽然它们是非常思考的包装器,并且仅根据需要进行实例化,因此通常不应该成为问题;但仍然。

以上是关于AutoBean、数组/列表属性和 JSNI的主要内容,如果未能解决你的问题,请参考以下文章

如何序列化 AutoBean (GWT) 中的列表?

GWT Autobean - 如何处理列表?

如何使用 AutoBean 实现不同基本类型(如字符串、整数等)的列表?

有没有办法注释 AutoBean 属性,使其不会被序列化/反序列化?

python里面数组,列表的属性和方法

列表渲染 之 v-for遍历数组和对象(利用key属性实现高效更新)