3

我有一个序列化类,我需要通过蓝牙作为对象发送,并且还实现了 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

4

1 回答 1

1

根据这个这个线程:

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

其次,用于ObjectOutputStream.reset()清除以前的值。

让我知道这个是否奏效 !

于 2013-04-19T06:52:38.373 回答