在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对象。
有人能指出我在这方面的正确方向,还是可能会给我一个关于如何解决这个问题的提示?我不知道如何将问题缩小到目前为止我所记录的范围之外。
答案 0 :(得分:1)
如果您不是第一次将此MyObject
写入流,则需要在写入之间使用ObjectOutputStream.reset()
,或ObjectOutputStream.writeUnshared().
请参阅Javadoc了解原因。
注意,当你抓住EOFException,
时,你的循环应该终止,并且可能也会抓住任何其他IOException
。