我正在尝试从服务器向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
}
Game
和Player
对象都在我的“共享”包中,应该在服务器端和客户端使用。
但是,CpuPlayer
包含许多内部处理数据,纯粹是服务器端。因此,它不包含在GWT序列化白名单中。
我想要做的是将CpuPlayer
作为Player
发送给客户端,即在序列化过程中屏蔽所有子类特性。
这种方法听起来有效吗?有没有办法做到这一点?我查看了自定义序列化,但它似乎没有那样工作(我需要逐个序列化所有字段)。
感谢您的帮助,
塞巴斯蒂安
答案 0 :(得分:1)
我能想到的最简单的解决方案是使用像Dozer这样的库将你需要的所有内容从CpuPlayer复制到播放器中。这就像调用
一样简单Player player = new DozerBeanMapper().map(cpuPlayer, Player.class);
(复制的性能开销可能微不足道(亚毫秒))。
另一种方法可能是使用RequestFactory而不是GWT-RPC,它只用于将服务器端对象的一部分传输到客户端(非常适合像你这样的情况,你不能将整个内部数据发送到客户端)