0

我要布局情况,问题在底部。

我有一个像这样的对象:

public class GameObject implements Serializable{
/**
 * 
 */
    private static final long serialVersionUID = 3081889342394131807L;
    public float x, y, vx, vy;
    public int size;
    public int mass;

    public GameObject()
    {
        Random rand = new Random();
        x = rand.nextInt(400);
        y = rand.nextInt(400);
        size = rand.nextInt(10);
        mass = size * size * size;
        vx = 0.3f;
        vy = 0.3f;
    }

    public void updateGameObject()
    {
        x+=vx;
        y+=vy;
    }
}

我有一个使用套接字的客户端-服务器设置:当服务器启动时,它会创建一个 GameObject 并将其添加到 HashMap。然后服务器循环,更新对象并发送更新的对象。连接是一个标准的套接字。

while (true)
{
    gameObject.updateGameObject();
    try {
        if (objOutputStream == null)
            objOutputStream = new ObjectOutputStream(connection.getOutputStream());
        objOutputStream.writeObject(o);
        objOutputStream.flush();
    } catch (Exception e) { e.printStackTrace(); }
}

在客户端,我只是读取对象并将其绘制到屏幕上。这就是问题发生的地方。我肯定会在每个循环中收到一个对象,但是当我阅读它时,GameObject 的字段似乎没有改变。

while (true)
{
    try {
            if (objInputStream == null)
                objInputStream = new ObjectInputStream(connection.getInputStream());
            return objInputStream.readObject();
        } catch (Exception e) { e.printStackTrace(); }
}

objInputStream 和 objOutputStream 都在 while 循环之上初始化。

如果我对我在客户端上获取的对象的 x 和 y 值执行 println(),则这些值永远不会从它们的初始值改变。

当我在发送之前对服务器上的 x 和 y 值执行 println() 时,它会打印出正确的值。像这样:

Sending Object with 1, 1
Received Object with 1, 1
Sending Object with 2, 2
Received Object with 1, 1
Sending Object with 3, 3
Received Object with 1, 1

我觉得我缺少一些基本的东西。虽然当我尝试找到与这个问题有关的其他问题时,我似乎找不到一个。也许你们中的一个可以为我提供一些见解?

4

2 回答 2

3

每当您想使用一组新值重新开始时,请使用ObjectOutputStream.writeUnshared()代替writeObject(),或调用。reset()

于 2013-11-10T23:30:44.643 回答
1

ObjectOutputStream尝试通过不将您之前写入的任何对象重写到流中来使序列化复杂的对象图变得轻松(由引用相等性确定,not equals())。

一个懒惰的解决方案是在发送之前实现你Cloneableclone()对象 - 但除非你在一个非常古老的 JDK 上,否则你会想要调用writeUnshared()它,因为它会写入你的对象的“新”副本而不是对以前的版本。

于 2013-11-09T20:41:12.983 回答