GWT&x2B;GXT序列化在微小更改后出错。但是为什么呢?

GWT&x2B;GXT序列化在微小更改后出错。但是为什么呢?,gwt,gxt,Gwt,Gxt,我以为我知道GWT序列化规则,但显然我不知道。这个案子太奇怪了,我花了几个小时想弄清楚,但还是没有运气。也许你们可以帮我一把 第一件事:堆栈跟踪 ...blah blah blah... Caused by: com.google.gwt.user.client.rpc.SerializationException: Type 'geos.dto.common.client.Market' was not included in the set of types which can be ser

我以为我知道GWT序列化规则,但显然我不知道。这个案子太奇怪了,我花了几个小时想弄清楚,但还是没有运气。也许你们可以帮我一把

第一件事:堆栈跟踪

...blah blah blah...
Caused by: com.google.gwt.user.client.rpc.SerializationException: Type 'geos.dto.common.client.Market' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = null
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126)
    at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:44)
    at com.google.gwt.user.client.rpc.core.java.util.HashSet_CustomFieldSerializer.serialize(HashSet_CustomFieldSerializer.java:39)
    at com.google.gwt.user.client.rpc.core.java.util.HashSet_CustomFieldSerializer.serializeInstance(HashSet_CustomFieldSerializer.java:51)
    at com.google.gwt.user.client.rpc.core.java.util.HashSet_CustomFieldSerializer.serializeInstance(HashSet_CustomFieldSerializer.java:28)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:740)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:621)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126)
    at com.extjs.gxt.ui.client.data.RpcMap_CustomFieldSerializer.serialize(RpcMap_CustomFieldSerializer.java:35)
    ... 78 more
因此,问题似乎在于
geos.dto.common.client.Market
。让我们看看仍然可以编译的最小值

package geos.dto.common.client;

public class Market extends RowModel<Integer>  {
    public static final String ID="id";
    public static final String NAME="name";

    public Market() { }
    public Market(int id, String name) { }
    public String getName() { }
    public void setName(String name) { }    
}
版本为GWT 2.4.0和GXT 2.2.5。我想很快升级它,但首先我想处理像这样的问题


我想就这些了。你看到我看不到的东西了吗?我当然希望如此!谢谢

希望您的包结构遵循命名约定:是否有可能必须将您的市场类移动到共享包中

如果进行rcp调用,则该类在客户端序列化,在服务器端反序列化。因此,必须能够从客户端和服务器访问该类。如果类位于客户端包中,则服务器无法访问此类。客户端和服务器端使用的类放在名为shared的包中

所以,所有只在客户机中需要的类都应该在一个名为client的包中。服务器和客户端所需的类应位于共享包内,而仅服务器端所需的类则位于服务器包内

这是我的抽象类,它扩展了BaseModelData并位于共享包中:

package de.gishmo.leela.application.shared.models;

import java.io.Serializable;

import com.extjs.gxt.ui.client.data.BaseModelData;

@SuppressWarnings("serial")
public abstract class MyBaseModel
  extends BaseModelData
  implements Serializable {

  public final static String MYFIELD = "myField";

  public abstract String getModelName();

}
在RCP呼叫中工作良好


并且请实现可序列化接口。

希望您的包结构遵循命名约定:是否有可能必须将您的市场类别移动到共享包中

如果进行rcp调用,则该类在客户端序列化,在服务器端反序列化。因此,必须能够从客户端和服务器访问该类。如果类位于客户端包中,则服务器无法访问此类。客户端和服务器端使用的类放在名为shared的包中

所以,所有只在客户机中需要的类都应该在一个名为client的包中。服务器和客户端所需的类应位于共享包内,而仅服务器端所需的类则位于服务器包内

这是我的抽象类,它扩展了BaseModelData并位于共享包中:

package de.gishmo.leela.application.shared.models;

import java.io.Serializable;

import com.extjs.gxt.ui.client.data.BaseModelData;

@SuppressWarnings("serial")
public abstract class MyBaseModel
  extends BaseModelData
  implements Serializable {

  public final static String MYFIELD = "myField";

  public abstract String getModelName();

}
在RCP呼叫中工作良好

请实现可序列化接口。

我忘记了

问题不在那门课上,一点也不在。问题是,它使用另一个类进行传输,该类也扩展了RowModel。它是这样设置的:

public void setMarkets(Set<Market> markets) {
    set(MARKETS,markets);
}
public void集合市场(集合市场){
集合(市场,市场);
}
因为我没有在那个类中包含Market类型,所以GWT不知道它应该在编译时序列化。增加
私人市场(u市场);BaseModelData
的子类相关的众所周知的问题(它不能序列化未声明为类字段的类型),但我完全忘记了它…

我忘记了

问题不在那门课上,一点也不在。问题是,它使用另一个类进行传输,该类也扩展了RowModel。它是这样设置的:

public void setMarkets(Set<Market> markets) {
    set(MARKETS,markets);
}
public void集合市场(集合市场){
集合(市场,市场);
}

因为我没有在那个类中包含Market类型,所以GWT不知道它应该在编译时序列化。增加
私人市场(u市场);BaseModelData
的子类相关的众所周知的问题(它不能序列化未声明为类字段的类型),但我完全忘记了它…

我不确定您的意思,抱歉!你能解释一下你在说什么共享包吗?谢谢你的解释!我一定要更新我的GWT知识(我从2008年开始使用它,老实说,从那时起我就没有读过它的很多文档;-)。无论如何,服务器有权访问该类。在此期间,我已经忘记了什么是错误的:无论如何,谢谢你!我不知道你这是什么意思,对不起!你能解释一下你在说什么共享包吗?谢谢你的解释!我一定要更新我的GWT知识(我从2008年开始使用它,老实说,从那时起我就没有读过它的很多文档;-)。无论如何,服务器有权访问该类。在此期间,我已经忘记了什么是错误的:无论如何,谢谢你!