【问题标题】:Serialize Object in GWT在 GWT 中序列化对象
【发布时间】:2010-10-18 08:25:45
【问题描述】:

使用 GWT 将 bean 序列化为字符串的最简单方法是什么?我不喜欢使用 GWT.create() 调用。

【问题讨论】:

  • 你说的是什么字符串? “property=value”对的列表?
  • 任何类型的字符串,只要能与原始实例来回转换即可。

标签: java serialization gwt javabeans


【解决方案1】:

免责声明: 在 URL 上序列化一个 bean 对于 GWT 来说并不是一个好主意。我了解到,如果需要在 URL 上放置数据,应该尽可能少,并且只需要恢复页面状态所需的数据。看看 Gmail 如何使用它的历史令牌,你会发现它非常少。

先免责声明:

对于我从事的 GWT 项目,我只是简单地写出 bean 的值,用分隔符分隔。在读回这些值时,我使用了 String.split() 方法来获取一个数组。使用该数组,我将值分配回正确的 bean 属性。在代码中:

public class Sample {

    private int a;
    private boolean b;
    private String c;
    //getters and setters for fields not shown

    public String toHistoryToken(){
        return a+"/"+b+"/"+c;
    }
    public void fromHistoryToken(String token){
        String[] values=token.split("/");
        a=Integer.parseInt(values[0]);
        b=Boolean.parseBoolean(values[1]);
        c=values[2];
    }
}

对于更复杂的场景,您可能需要做更复杂的事情。例如,对于嵌套对象,您必须编写代码将值传递给子对象。

另外,请注意,您必须确保您使用的任何值都不包含分隔符。因此,如果您知道您的字符串可能包含“/”,那么您可能需要对它们执行 replace() 操作以转义任何嵌套分隔符。

【讨论】:

    【解决方案2】:

    我不确定我是否理解您最终想要完成的任务。

    如果你真的只是想来回发送字符串,你真的不需要做任何事情——你可以使用普通的 GWT RPC 机制免费获得。只需创建一个返回 java.lang.String 的方法,创建随附的实现和 Async 接口,就完成了。

    另一方面,如果您真的想发送一个 bean,只需确保它具有零参数构造函数并实现 SerializableIsSerializable

    【讨论】:

    • 我想将 bean 吐到 URL 栏,这是最简单的方法。
    • 正如 Miguel 上面所说,GWT 中没有反射。你最好只写一个自定义的“toUrl()”方法。
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      也许这就是你要找的东西?

      Json <-> Java serialization that works with GWT

      加长版:

      使用 Json-lib 库:

      http://json-lib.sourceforge.net/

      你可以这样做(从 bean 到 json 字符串):

      http://json-lib.sourceforge.net/snippets.html#Creating_a_JSONObject_from_a_JavaBean

      【讨论】:

      • 类似的东西,但我不想为我的所有课程(40+)编写覆盖类型。我想要一种简单、非侵入性的方式将对象序列化为字符串。
      • 非侵入性是相对的,因为我考虑为我要传递的所有数据制作覆盖类型,但是如果你想要一种直接从 Bean 到 JSON 字符串对象的方法,查看我的更新。
      • 我确信 json-lib 不会在 GWT(客户端)中工作,因为它可能通过 BeanInfo 使用反射。我现在无法检查来源。
      【解决方案5】:

      GWT 的一些细微差别可能会使事情复杂化,但通常是这样的:

      • JAXBXStream 这样的 XML 数据绑定/映射库可以做到这一点
      • 借助 JSON,Jackson 之类的库可以进行灵活的全 bean 绑定,类似于 JAXB,但配置更少(如果需要,速度更快)。

      应该可以。

      【讨论】:

      • 这不会削减它,因为这些库可能使用反射,这在 GWT 客户端不可用。
      【解决方案6】:

      最终,GWT 是在 JavaScript 中运行的(即使它是用 Java 编写的)。从这个意义上说,“java bean”不是您在客户端中容易找到的东西,但它们在服务器中(在 Java 中)可以正常工作。

      如果您接受 bean 实际上只是一个无方法的对象,那么您使用它们的潜在意图是移动数据。在 JavaScript 中,JSON 也可以作为一个极其灵活的数据容器。在服务器端,可以使用 BeanUtils(以及一些遍历)将 Bean 数组转换为 JSON。 JSON 可以在 GWT 中序列化为字符串,并且 GWT 有一个解析器将 JSON 转换回客户端的 JavaScript 对象。

      这可能不是最简单的方法,但是一旦你开始使用它就会非常灵活。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 2023-03-09
        • 1970-01-01
        • 2011-05-16
        • 2012-04-02
        相关资源
        最近更新 更多