在使用objectInputStream.readObject()反序列化后,为什么我的对象的字段设置为默认值?

时间:2015-03-10 06:18:26

标签: java android bluetooth

在Java中,我有一个简单的类,有三个公共(原始)字段,如下所示:

public class MyObject implements Serializable {
    public volatile float x, y, z;

    public MyObject() {
        this(0, 0, 0);
    }

    public MyObject(float x, float y, float z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public void set(float x, float y, float z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public void set(MyObject other) {
        set(other.x, other.y, other.z);
    }
}

我将对象写入对象输出流,如下所示:

public void write(MyObject myObject) {
    try {
        mObjectOutStream.writeObject(myObject);
        mObjectOutStream.flush();

        Log.d(TAG, "wrote myObject.x as:" + myObject.x);
        Log.d(TAG, "wrote myObject.y as:" + myObject.y);
        Log.d(TAG, "wrote myObject.z as:" + myObject.z);
    } catch (IOException) {
        Log.e(TAG, "Exception during write", e);
    }
}

并且,我在一个单独的线程中通过阻塞调用从对象输入流中读取对象,如下所示:

public void run() {
    while (true) {
        try {
            MyObject myObject = (MyObject) mObjectInStream.readObject();

            Log.d(TAG, "read myObject.x as:" + myObject.x);
            Log.d(TAG, "read myObject.y as:" + myObject.y);
            Log.d(TAG, "read myObject.z as:" + myObject.z);
        } catch (IOException) {
            Log.e(TAG, "Exception during read", e);
        } catch (ClassNotFoundException) {
            Log.e(TAG, "Exception during read", e);
        }
    }
}

不知何故,我的日志显示的内容如下:

BluetoothService: wrote myObject.x as: 0.37361085
BluetoothService: wrote myObject.y as: 0.87006456
BluetoothService: wrote myObject.z as: 1.7877682
BluetoothService: read myObject.x as: 0.0
BluetoothService: read myObject.y as: 0.0
BluetoothService: read myObject.z as: 0.0

我尝试将字段声明为volatile以确保它们是线程安全的,以及为MyObject类实现readObject和writeObject方法,但这些方法都没有帮助。

我怀疑(希望)我错过了一些人可以指出的简单。

如果相关,我在Android上使用蓝牙套接字。我已经成功发送了String对象,但是在Android示例代码的BluetoothChat示例中使用了byte[]。我无法发送我的Serializable对象。

有人能指出我在这方面的正确方向,还是可能会给我一个关于如何解决这个问题的提示?我不知道如何将问题缩小到目前为止我所记录的范围之外。

1 个答案:

答案 0 :(得分:1)

如果您不是第一次将此MyObject写入流,则需要在写入之间使用ObjectOutputStream.reset(),或ObjectOutputStream.writeUnshared().请参阅Javadoc了解原因。

注意,当你抓住EOFException,时,你的循环应该终止,并且可能也会抓住任何其他IOException