【问题标题】:How to write a GWT CustomSerializer for XMLGregorianCalendar?如何为 XMLGregorianCalendar 编写 GWT CustomSerializer?
【发布时间】:2014-11-07 14:21:16
【问题描述】:

我需要一个通过 RPC 序列化 XMLGregorianCalendar 的解决方案。

到目前为止,我为 XMLGregorianCalendar 对象编写了一个自定义序列化程序,但要序列化的对象是 Calendar 类型 (com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl) 的内部 Xerxes 实现。

所以我的序列化程序失败得很惨,因为它没有被使用。

为内部对象编写序列化程序不是一个好主意,并且会在 Eclipse 中产生警告,表明该类受到限制(访问限制:由于所需库 C:\java\jre\lib 的限制,无法访问 XMLGregorianCalendarImpl 类型\rt.jar)。

有没有人成功地在客户端使用这个带有 GWT 的 XMLGC? 我可以替换 gwt.xml 中的 XMLGC 类并用不同的东西替换它吗?

任何帮助表示赞赏!

更新:

想告诉你到目前为止没有什么效果:

  • 添加了 Supersource 路径并将 XMLGC 类替换为更简单的类,仅携带数据元素。

  • 为 XMLGC 添加了一个自定义序列化程序类,用于从/向轻量级超级源类序列化 XMLGC。

  • 该方法在运行时失败,因为传输的对象不是 XMLGC,而是 com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl,它位于rt.jar.

  • 对 XMLGCImpl 重复相同步骤的方法对我来说失败了,可能是因为我太笨了,可能是因为密封的包装阻碍了这个过程。

有人可以确认,这种方法应该有效还是因为 Impl 类而注定要失败?也许有一个 GWT 注释/配置,我可以告诉序列化程序接受 XMLGC 序列化程序以用于 XMLGC 的任何扩展?

【问题讨论】:

    标签: java gwt serialization


    【解决方案1】:

    问题不在于 RPC 序列化。问题是XMLGregorianCalendar不是emulated,所以不能在客户端使用。通过 RPC 对其进行序列化也无济于事。

    有一个issue to add better javax.time support to GWT,但模拟这些日期和时间 API 非常复杂,因此仍在进行中。

    目前,作为一种解决方法,我建议在 DTO 中使用java.util.Date,并在服务器端使用映射层将包含 XMLGregorianCalendar 的“服务器 POJO”转换为包含日期的“GWT DTO”。

    另外,在谷歌搜索时,我发现了this class,它是Enunciate 库的一部分。它可能对 XMLGregorianCalendar 服务器端的日期映射有用。

    【讨论】:

    • 是的,我知道它不可用。我已经在这一步之上:-) 我实际上正在寻找一种在客户端上使用公历的方法,方法是用我自己的替换实现。我想,我已经很好地编写了序列化程序,实际上,我可以编译我的代码。但是现在,在运行时,XMLGC 实际上是另一个对象。我可以建议序列化程序用不同的东西替换那个对象吗?如您所见,Xerces 包是密封的,因此我无法对此类进行任何覆盖。目前,我已经复制到 DTO,但不需要复制该层。
    • 许多人已经尝试在客户端上使用 GregorianCalendar / XMLGregorianCalendar / DateTime,并且创建了一些开源项目(例如 gwt-joda-time)以及功能请求(code.google.com/p/google-web-toolkit/issues/detail?id=603)。但是这些项目不再活跃,而且该功能还没有添加到 GWT 中,因为在 GWT 中模拟日期时间代码比看起来更难。这就是为什么我认为在 GWT 中重新实现 GregorianCalendar 可能很复杂。你不能用日期替换 DTO 中的 XMLGregorianCalendar 吗?
    • 更改 XML 层太多了。我将研究推土机实用程序。现在,我们回退到“半生成”的委托 DTO,它将用字符串包装 XMLGC 字段。缺点是,我必须为每个包含对象的 XMLGC 创建一个新对象,并且不能简单地将对象图从 XML 通过 RPC 复制到客户端。由于我们只需要在客户端读取 XMLGC 内部的值,因此我们希望能够将客户端代码中的 XMLGC 基本上替换为字符串的包装器。但情况似乎并非如此。我没有回答这个问题,并赞成你的回答,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 2016-02-10
    • 1970-01-01
    • 2012-06-26
    • 2013-12-17
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多