【问题标题】:converting gwt shared object to json将 gwt 共享对象转换为 json
【发布时间】:2023-04-05 09:46:01
【问题描述】:

有人可以向我解释为什么在 GWT 中你不能将客户端/共享 pojo(实现 Serializable)转换为 JSON 对象,而无需像使用 AutoBeanFactory(例如 GWT (Client) = How to convert Object to JSON and send to Server?)或创建 JavaScript 覆盖对象那样跳过一大堆(因此扩展了 JavaScriptObject)

GWT 将您的客户端对象编译成一个 javascript 对象,那么如果您要求它,它为什么不能简单地将您的 javascript 转换为 JSON?

提供的 GWT JSON 库仅允许您对扩展 JavaScriptObject 的 Java 对象进行 JSON 化处理

我显然对 GWT 有一些误解,因为 GWT 将简单的 java POJO 编译为 javascript 对象,而在 javascript 中您可以将其 JSON.stringify 为 JSON,那么为什么不在 GWT 中呢?

【问题讨论】:

    标签: json gwt


    【解决方案1】:

    GWT 编译您的应用程序,而不仅仅是转换它。它确实利用 JavaScript 中的 prototype 对象来根据需要构建类,通常遵循您的类层次结构(以及您使用的任何 GWT 类),但它还进行了许多其他更改:

    优化:

    • 收紧类型 - 如果您引用 List,但它只能是 ArrayList,它会重写类型声明。这本身并没有多大作用,但它可以让其他步骤做得更好,例如
    • 将方法设为静态 - 例如,如果没有任何东西覆盖 ArrayList.add,这会将任何可以证明对 ArrayList.add 的调用转换为静态调用,从而无需动态调度,并允许使用“this”字符串在最终的 JS 中被替换为更短的 arg 名称。这将阻止 JS 对象拥有您期望它拥有的方法。
    • 内联方法 - 如果一个方法足够简单,并且在足够少的地方被调用,编译器可能会完全删除该方法,因为它知道调用它的所有地方。这将直接影响您的用例。
    • 删除/内联未引用的字段 - 如果您读取一个字段但只写入一次,它将假定原始值是一个常量。如果您不阅读它,则没有理由分配它。编译器无法判断的值将不会被使用,不需要占用 js 中的空间和浏览器中的时间。这也将直接影响将 gwt'd Java 视为 JS。

    在这些之后,除其他外,编译器将重命名字段、参数和类型,使其尽可能小 - 完成后,字段或参数很少会超过 1 个字符,因为这些是最常用的并且具有最小的范围,因此可以被编译器最频繁地重用。这也会影响尝试将对象视为 JSON。

    允许您将 GWT 对象导出为 JSON 的库是通过做出一些其他假设来实现的。

    • JavaScriptObject (JSO) 不是真正的 Java 对象,但实际上代表一个 JavaScript 实例,因此您可以随意来回转换 - 您编写的 JSNI 会出现相对未优化的情况,因为编译器无法判断您是否正在尝试与外部库通信。
    • AutoBeans 的生成假定它们应该能够写出 JSON,因此编写了对对象进行编码的特定方法。它们将遵循与编译的其他 Java 相同的规则 - 代码不是used 可能会被删除,仅以一种方式调用的代码可能会被收紧或内联。
    • 可以导出 JS 的库以 Java 的详细信息编译到最终的可执行文件中,使其更大,但让您能够以某种有限的方式将这些 Java 对象视为 JS。

    最后一点,因为您同时在谈论 JSON 和 Javascript - 一些普通的 JS 不适合写成 JSON。日期对象没有 JSON 识别的一致的序列化方式。非树对象图不能序列化:

    var obj = {};
    obj.prop = {};
    obj.prop.obj = obj;
    

    Autobeans 带有用于这些循环引用的内置检查器,我希望 JSO 序列化也能做到。

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 2012-02-24
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多