2

目前我有一个类设置作为自动bean处理:

public interface Asset extends Hit {
    String getGuid();
    String getHitType();
    Map<String,Serializable> getMetadata();
}

我尝试使用 Object 而不是 Serializable:

Map<String,Object>  getMetadata()

但这在尝试访问数据时似乎会爆炸(因为它没有“具体化”)。

元数据映射可能包含其他映射、字符串、整数等。如何从该元数据对象的内部映射中检索数据?

目前,如果我打电话给asset.getMetadata().get("title"); 这将返回一个 SerializableAutoBean 并在该对象上执行 toString() 或 String.valueOf(obj) 返回内存中的对象信息,而不是实际的字符串值。

AutoBean 对象可以是动态的,还是您必须专门定义每个字段?

4

1 回答 1

0

AutoBeans 在 Java 泛型或 RTTI 意义上不是“动态的”。

在 GWT 中,对于任何自动生成的东西(包括 AutoBeans),在编译时都必须知道所有类型。这对您的设计施加了限制,不允许您充分利用 Java 的语言特性(特别是泛型和其他 RTTI 特性)。因此,AutoBeans 在 RTTI 或 Java 通用意义上不是动态的。但是,AutoBeans 只是一种包装数据的低级方式,您仍然可以使用 Splittables 访问数据!

如前面的评论中所述,您可以将Splittables 用于在序列化/解码时类型未知的JSON 对象部分。当然,让所有事情同时发生会很好,但是没有什么能阻止您对数据对象执行一些后处理以使它们进入您想要的状态。

对于某人来说,“Grok”AutoBeans(以及其他任何自动生成的东西)正在发生的事情的一个非常好的方法是查看生成的代码。maven 的默认位置是:${project.build.directory}/.generated.

如果您在编译后查看那里,您应该会找到 GWT 编译器为您的 AutoBeans 生成的代码。

于 2013-03-21T16:23:16.450 回答