繁体   English   中英

Java-序列化对象中的序列化对象问题

[英]Java - Problems with serialized objects within serialized objects

嘿,我正在制作一款趣味游戏,并且我已经通过研究和阅读解决了大多数问题,但现在我陷入了困境。

游戏快速说明:两个客户端连接到服务器,游戏开始。 服务器执行所有计算,并在每个周期向客户端发送一个序列化的GameState对象。 GameState只是一堆变量,显示了玩家的位置和一些获取者/设定者。 这很好。 但是,现在我在游戏状态中创建了一个导弹的arrayList,导弹是一个单独的对象,并且可以序列化。 客户端和服务器都具有GameState类和Missile类的相同副本。

当客户端按空格键时,将添加导弹,服务器会进行注册。 我让服务器在游戏状态的服务器版本中打印导弹的数量。 在客户端打印导弹数量始终为零。 这是一些我仅尝试放入相关内容的代码。

服务器将对象发送给玩家player.objectout只是将一个对象写入objectoutputstream

public void updatePlayerOutput(){
    GameState send = new GameState(gameState);
    leftPlayer.playerObjectOut(send);
    rightPlayer.playerObjectOut(send);
}

GameState的主要部分(不包括getter和setter)。 左右=玩家1和玩家2

public class GameState implements Serializable {

private double leftX;
private double leftY;
private double rightX;
private double rightY;
private ArrayList<Missile> missiles;

public GameState(){
    missiles = new ArrayList<Missile>();
}

public GameState(GameState game){
    leftX = game.getLeftX();
    leftY = game.getLeftY();
    rightX = game.getRightX();
    rightY = game.getRightY();
    missiles = game.getMissiles();
}

导弹级

  public class Missile implements Serializable {

private double x;
private double y;

private double dX;

public Missile(double inX, double inY, double inDX){
    x = inX;
    y = inY;
    dX = inDX;
}

public Missile(Missile inMissile){
    x = inMissile.getX();
    y = inMissile.getY();
    dX = inMissile.getDX();
}

最后是客户阅读的地方。 面板是一个JPanel,并使用gamestate获取绘制图像的位置

while(true){
    gameState = (GameState)(ois.readObject());
    panel.setGameState(gameState);
    panel.repaint();
    updateOutput();
    }

同样在相关说明(可能是我提出主要问题的原因)上,在我链接的代码的第一部分中,我必须创建要发送的全新GameState对象。 为什么是这样? 如果我尝试仅发送gameState变量strightup,则不会保留任何信息。 谢谢 :)

因此,如果我理解正确,则服务器具有游戏状态,将其序列化,然后将其发送给玩家。 然后,玩家修改收到的游戏状态的内容,服务器上的游戏状态不包含更新,您会感到惊讶。

那是意料之中的。 序列化不会发送对该对象的远程引用。 它将对象转换为字节序列,发送该字节序列,然后由接收器从字节序列中重建对象。

打个比方,使用序列化发送对象就像获取纸质文档并将其传真一样。 接收者在接收到的传真上写的任何内容都不会神奇地出现在原始文档上。

如果您希望服务器知道更改,则客户端必须将更新发送到服务器。

关于问题的最后一部分,如果我理解正确,则您尝试将同一对象多次发送到同一ObjectOutputStream,并且接收方没有看到第一个对象状态与后续对象状态之间的任何区别。 这也是预期的。 第二次发送同一对象仅发送对先前发送的对象的引用。 这对于支持多次引用同一对象的对象图是必需的。 您需要调用reset()来重置流,并能够发送已发送对象的新状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM