通过网络进行Java序列化,重新生成相同的对象?

时间:2013-11-09 20:37:27

标签: java sockets serialization deserialization

我将对情况进行布局,问题就在底部。

我有一个像这样的对象:

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

ObjectOutputStream尝试通过不重写您之前写入的任何对象(通过引用相等而不是equals())来使对象的复杂图形无序地序列化。

一个懒惰的解决方案是在发送之前实现Cloneableclone()您的对象 - 但除非您使用完全古老的JDK,否则您需要调用writeUnshared(),因为它会写一个对象的“新”副本而不是对先前版本的引用。