gwt rpc序列化泛型类

gwt rpc序列化泛型类,gwt,rpc,gwt-rpc,Gwt,Rpc,Gwt Rpc,我需要将一个类对象作为泛型通过gwt rpc连接传递,但rpc似乎不配合它。该类使用java.io.Serializable进行序列化。我已经使用gwt IsSerializable进行了检查,但仍然存在错误 这是我的密码 java @SuppressWarnings("serial") @PersistenceCapable @Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE) public abstract class MyS

我需要将一个类对象作为泛型通过gwt rpc连接传递,但rpc似乎不配合它。该类使用java.io.Serializable进行序列化。我已经使用gwt IsSerializable进行了检查,但仍然存在错误

这是我的密码

java

@SuppressWarnings("serial")
@PersistenceCapable
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
public abstract class MySource implements Serializable {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private String userId;
@Persistent
private String title;
@Persistent
private String description;
@Persistent
private String blobKey;
@Persistent
private String youtubeLink;
@Persistent
private String personalLink;
@Persistent
private Date submitedDate;
@Persistent
private float price;


public float getPrice() {
    return price;
}

public void setPrice(float price) {
    this.price = price;
}

public String getUserId() {
    return userId;
}

public void setUserId(String userId) {
    this.userId = userId;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getBlobKey() {
    return blobKey;
}

public void setBlobKey(String blobKey) {
    this.blobKey = blobKey;
}

public String getYoutubeLink() {
    return youtubeLink;
}

public void setYoutubeLink(String youtubeLink) {
    this.youtubeLink = youtubeLink;
}

public String getPersonalLink() {
    return personalLink;
}

public void setPersonalLink(String personalLink) {
    this.personalLink = personalLink;
}

public Date getSubmitedDate() {
    return submitedDate;
}

public void setSubmitedDate(Date submitedDate) {
    this.submitedDate = submitedDate;
}

public Long getId() {
    return id;
}

}
@SuppressWarnings("serial")
@PersistenceCapable
public class AndroidSource extends MySource{

public AndroidSource() {
    super();
}

}
AndroidSource.java

@SuppressWarnings("serial")
@PersistenceCapable
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
public abstract class MySource implements Serializable {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private String userId;
@Persistent
private String title;
@Persistent
private String description;
@Persistent
private String blobKey;
@Persistent
private String youtubeLink;
@Persistent
private String personalLink;
@Persistent
private Date submitedDate;
@Persistent
private float price;


public float getPrice() {
    return price;
}

public void setPrice(float price) {
    this.price = price;
}

public String getUserId() {
    return userId;
}

public void setUserId(String userId) {
    this.userId = userId;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getBlobKey() {
    return blobKey;
}

public void setBlobKey(String blobKey) {
    this.blobKey = blobKey;
}

public String getYoutubeLink() {
    return youtubeLink;
}

public void setYoutubeLink(String youtubeLink) {
    this.youtubeLink = youtubeLink;
}

public String getPersonalLink() {
    return personalLink;
}

public void setPersonalLink(String personalLink) {
    this.personalLink = personalLink;
}

public Date getSubmitedDate() {
    return submitedDate;
}

public void setSubmitedDate(Date submitedDate) {
    this.submitedDate = submitedDate;
}

public Long getId() {
    return id;
}

}
@SuppressWarnings("serial")
@PersistenceCapable
public class AndroidSource extends MySource{

public AndroidSource() {
    super();
}

}
CategoryBrowseService.java是远程服务模型

@RemoteServiceRelativePath("categoryService")
public interface CategoryBrowseService extends RemoteService{


ArrayList<MySource> getSourceList(Class<? extends MySource> classType); 
}
@RemoteServiceRelativePath(“类别服务”)
公共接口CategoryBrowseService扩展了RemoteService{

ArrayList getSourceList(Class可能是MySource.java中与持久性相关的注释使其无法转换为javascript。请尝试删除注释以查看其是否相关。同时确保MySource.java位于模块xml文件(“source”元素)中声明为可转换的包中.

带有持久性注释的类可以在服务器端很好地工作,但是如果您想将其数据传递给客户端,则必须创建一个普通的java可序列化类,以便将数据从服务器传输到客户端


如前一个回答中所述,客户端不支持持久性注释,因为它们无法转换为等效的javascript代码(这是有意义的,因为客户端不负责持久性).

问题是您试图通过网络传输
对象。我不知道它为什么在开发模式下工作(我在本地项目上尝试过,但失败了),但它不应该起作用。您必须使用其他内容而不是
名称,例如字符串,它将包含类的名称。理论上,如果您为
创建CustomFieldSerializer,它可以起作用,但使用字符串而不是类会更容易。

尝试使用
实现可序列化
来定义你们班。 我的意思是:

    public class AndroidSource extends MySource implements Serializable{

public AndroidSource() {
    super();
}

}

您的RPC服务必须只处理可序列化对象。域类不可翻译为JavaScript,因此GWT无法通过网络(RPC协议)发送和接收此类对象。您需要创建DTO类(wich域类)实现java.io.Serializable,然后重新配置所有RPC服务,以便在输入DTO和输出DTO中使用。祝您的项目好运。

关于持久性注释,我同意你们两人的看法,但如果我将Android对象作为java实例而不是泛型传递,它将完全正常工作。但是,如果我没有任何持久性注释,则如何将它们存储到数据库中?我应该使用DTO解决方案吗???
Compiling module com.sourcebay.SourceBay
   Scanning for additional dependencies: file:/home/santaris/workspace/SourceBay/src/com/sourcebay/client/presenter/mybay/browse/CategoryBrowsePresenter.java
      Computing all possible rebind results for 'com.sourcebay.client.model.mybay.browse.CategoryBrowseService'
         Rebinding com.sourcebay.client.model.mybay.browse.CategoryBrowseService
            Invoking generator com.google.gwt.user.rebind.rpc.ServiceInterfaceProxyGenerator
               Generating client proxy for remote service interface 'com.sourcebay.client.model.mybay.browse.CategoryBrowseService'
                  [ERROR] java.lang.Class<T> is not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' or 'java.io.Serializable' nor does it have a custom field serializer (reached via java.lang.Class<? extends com.sourcebay.shared.source.MySource>)
                  [ERROR] java.lang.Class<T> has no available instantiable subtypes. (reached via java.lang.Class<? extends com.sourcebay.shared.source.MySource>)
                     [ERROR]    subtype java.lang.Class<T> is not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' or 'java.io.Serializable' nor does it have a custom field serializer (reached via java.lang.Class<? extends com.sourcebay.shared.source.MySource>)
   [ERROR] Errors in 'file:/home/santaris/workspace/SourceBay/src/com/sourcebay/client/presenter/mybay/browse/CategoryBrowsePresenter.java'
      [ERROR] Line 75:  Failed to resolve 'com.sourcebay.client.model.mybay.browse.CategoryBrowseService' via deferred binding
    public class AndroidSource extends MySource implements Serializable{

public AndroidSource() {
    super();
}

}