3

Bluetooth経由でオブジェクトとして送信する必要があるSerializedクラスがあり、Runnableも実装しています。そのため、最初にいくつかの変数を設定し、それを別の Android デバイスによって実行されるオブジェクトとして送信します。別の Android デバイスは、その結果を変数に設定し、結果を変数の 1 つとして同じオブジェクトを送り返します。次の 2 つのメソッドを使用して、オブジェクトをシリアル化し、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; 
}

これら 2 つのメソッドから同じエラーが引き続き発生するため、以下に示すように、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