GWT - 序列化为超类

时间:2013-12-21 10:06:29

标签: gwt serialization

我正在尝试从服务器向GWT中的客户端发送Game对象。此Game对象只包含Player

的列表
public class Game implements Serializable {
    private List<Player> players;
}

Player是一个简单的Pojo,包含玩家的状态,如姓名,剩余生命等。

public class Player implements Serializable {
    private String name;
    private int numberOfGamesPlayed;
    private double hp, initialHp;
}

但是,游戏还可以包含CpuPlayer,即具有其他人工智能逻辑的Player

public class CpuPlayer extends Player {
    private PlayerIntelligence intelligence; // Not serializable
}

GamePlayer对象都在我的“共享”包中,应该在服务器端和客户端使用。

但是,CpuPlayer包含许多内部处理数据,纯粹是服务器端。因此,它不包含在GWT序列化白名单中。

我想要做的是将CpuPlayer作为Player发送给客户端,即在序列化过程中屏蔽所有子类特性。

这种方法听起来有效吗?有没有办法做到这一点?我查看了自定义序列化,但它似乎没有那样工作(我需要逐个序列化所有字段)。

感谢您的帮助,
塞巴斯蒂安

1 个答案:

答案 0 :(得分:1)

我能想到的最简单的解决方案是使用像Dozer这样的库将你需要的所有内容从CpuPlayer复制到播放器中。这就像调用

一样简单
Player player = new DozerBeanMapper().map(cpuPlayer, Player.class);

(复制的性能开销可能微不足道(亚毫秒))。

另一种方法可能是使用RequestFactory而不是GWT-RPC,它只用于将服务器端对象的一部分传输到客户端(非常适合像你这样的情况,你不能将整个内部数据发送到客户端)