Json < - >与GWT一起工作的Java序列化?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (30)

我正在寻找一个可能与GWT一起工作的简单的 Json(de)序列化程序。我搜索了一下,发现了一些需要注释每个成员或者定义无用接口的解决方案。非常无聊。为什么我们没有像这样简单的东西

class MyBean {
    ...
}

new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
提问于
用户回答回答于

看看GWT的覆盖类型。我认为这是迄今为止在GWT中使用JSON最简单的方法。以下是链接文章的修改代码示例:

public class Customer extends JavaScriptObject {
    public final native String getFirstName() /*-{ 
        return this.first_name;
    }-*/;
    public final native void setFirstName(String value) /*-{
        this.first_name = value;
    }-*/;
    public final native String getLastName() /*-{
        return this.last_name;
    }-*/;
    public final native void setLastName(String value) /*-{
        this.last_name = value;
    }-*/;
}

一旦定义了覆盖类型,就很容易从JSON创建JavaScript对象并访问其在Java中的属性:

public static final native Customer buildCustomer(String json) /*-{
    return eval('(' + json + ')');
}-*/;

如果您想再次使用该对象的JSON表示,则可以将覆盖类型包装在JSONObject中:

Customer customer = buildCustomer("{'Bart', 'Simpson'}");
customer.setFirstName("Lisa");
// Displays {"first_name":"Lisa","last_name":"Simpson"}
Window.alert(new JSONObject(customer).toString());
用户回答回答于

另一个要尝试的是GWT 2.1中引入的新的AutoBean框架。

你为你的bean和发布它们的工厂定义接口,GWT为你生成实现。

interface MyBean {
  String getFoo();
  void setFoo(String foo);
}

interface MyBiggerBean {
  List<MyBean> getBeans();
  void setBeans(List<MyBean> beans>;
}

interface Beanery extends AutoBeanFactory{
  AutoBean<MyBean> makeBean();
  AutoBean<MyBiggerBean> makeBigBean();
}

Beanery beanFactory = GWT.create(Beanery.class);

void go() {
  MyBean bean = beanFactory.makeBean().as();
  bean.setFoo("Hello, beans");
}

AutoBeanCodex可用于它们序列,并从JSON。

AutoBean<MyBean> autoBean = AutoBeanUtils.getAutoBean(bean);
String asJson = AutoBeanCodex.encode(autoBean).getPayload();

AutoBean<MyBean> autoBeanCloneAB = 
  AutoBeanCodex.decode(beanFactory, MyBean.class, asJson );

MyBean autoBeanClone = autoBeanCloneAB.as(); 
assertTrue(AutoBeanUtils.deepEquals(autoBean, autoBeanClone));

他们也在服务器端工作 - 使用,AutoBeanFactoryMagic.create(Beanery.class)而不是GWT.create(Beanery.class)

扫码关注云+社区