我将对情况进行布局,问题就在底部。
我有一个像这样的对象:
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
我觉得我遗失了一些基本的东西。虽然当我尝试用这个问题找到其他问题时,我似乎找不到一个问题。也许你们中的一个可以为我提供一些见解?
答案 0 :(得分:3)
当您想要使用一组新值重新开始时,请使用ObjectOutputStream.writeUnshared()
代替writeObject(),
或致电reset()
。
答案 1 :(得分:1)
ObjectOutputStream
尝试通过不重写您之前写入的任何对象(通过引用相等而不是equals()
)来使对象的复杂图形无序地序列化。
一个懒惰的解决方案是在发送之前实现Cloneable
和clone()
您的对象 - 但除非您使用完全古老的JDK,否则您需要调用writeUnshared()
,因为它会写一个对象的“新”副本而不是对先前版本的引用。