【问题标题】:GWT - Serialize as superclassGWT - 序列化为超类
【发布时间】:2013-12-21 10:06:29
【问题描述】:

我正在尝试将Game 对象从服务器发送到 GWT 中的客户端。此 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 发送给客户端,即在序列化过程中屏蔽所有子类特性。

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

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

【问题讨论】:

    标签: gwt serialization


    【解决方案1】:

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

    Player player = new DozerBeanMapper().map(cpuPlayer, Player.class);
    

    (复制的性能开销可能可以忽略不计(亚毫秒)。

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

    【讨论】:

    • 我采用了您的第一个映射方法。在发送结果之前简单地添加一个过滤器比更改调用我的服务的方式要容易得多。
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多