gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:48:24 26 4
gpt4 key购买 nike

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

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 对象,但使用 byte[],如 Android 示例代码中的 BluetoothChat 示例。我无法发送我的可序列化对象。

有人可以在这里为我指明正确的方向,或者给我一些关于如何解决此问题的提示吗?我不知道如何缩小问题范围,超出我迄今为止记录的范围。

最佳答案

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

注意,当您捕获 EOFException 时,您的循环应该终止,也可能捕获任何其他 IOException

关于java - 为什么在使用 objectInputStream.readObject() 反序列化后我的对象的字段设置为默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28957280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com