gpt4 book ai didi

android - 通过蓝牙发送序列化对象时出现 StreamCorruptedException

转载 作者:太空狗 更新时间:2023-10-29 14:22:09 25 4
gpt4 key购买 nike

我有一个序列化类,我需要通过蓝牙将其作为对象发送,并且还实现了 Runnable。因此,我首先设置了一些变量,然后将其作为对象发送给另一台 Android 设备执行,然后将其结果设置为一个变量,并在其中一个变量中发送回相同的对象和结果。我一直在使用以下两种方法来序列化我的对象并在通过我的 BluetoothSocket 的 OutputStream 发送它们之前获取一个 ByteArray,并反序列化该 ByteArray 以取回我的对象​​。

public static byte[] serializeObject(Object o) throws IOException { 
ByteArrayOutputStream bos = new ByteArrayOutputStream();

ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(o);
out.flush();
out.close();

// Get the bytes of the serialized object
byte[] buf = bos.toByteArray();

return buf;
}

public static Object deserializeObject(byte[] b) throws OptionalDataException, ClassNotFoundException, IOException {
ByteArrayInputStream bis = new ByteArrayInputStream(b);

ObjectInputStream in = new ObjectInputStream(bis);
Object object = in.readObject();
in.close();

return object;
}

我仍然从这两种方法中得到同样的错误,所以我尝试将它与我用来通过 BluetoothSocket 的 OutputStream 发送我的 ByteArray 的方法合并,如下所示。

public void sendObject(Object obj) throws IOException{
ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
ObjectOutputStream out = new ObjectOutputStream( bos );
out.writeObject(obj);
out.flush();
out.close();

byte[] buf = bos.toByteArray();
sendByteArray(buf);
}
public void sendByteArray(byte[] buffer, int offset, int count) throws IOException{
bluetoothSocket.getOutputStream().write(buffer, offset, count);
}

public Object getObject() throws IOException, ClassNotFoundException{
byte[] buffer = new byte[10240];
Object obj = null;
if(bluetoothSocket.getInputStream().available() > 0){
bluetoothSocket.getInputStream().read(buffer);

ByteArrayInputStream b = new ByteArrayInputStream(buffer);
ObjectInputStream o = new ObjectInputStream(b);
obj = o.readObject();
}
return obj;
}

最后,我在接收设备反序列化对象时得到了同样的错误,如下所示。

java.io.StreamCorruptedException
at java.io.ObjectInputStream.readStreamHeader (ObjectInputStream.java:2102)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:372)
and so on...

有人可以帮忙吗?我很绝望,这已经折磨了我好几个星期了,我需要它在几天内工作。 :S

最佳答案

根据 thisthis线程:

您应该在套接字的生命周期内使用单个 ObjectOutputStreamObjectInputStream,并且不要在套接字上使用任何其他流。

其次,使用 ObjectOutputStream.reset() 清除之前的值。

让我知道这是否有效!

关于android - 通过蓝牙发送序列化对象时出现 StreamCorruptedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15733449/

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