我可以从包含我的对象引用的字符串转换为对象吗? Android Studio

时间:2019-05-11 12:42:12

标签: java android casting bluetooth

我目前正在通过蓝牙从用户向另一个对象发送商品(购物)。 当我从服务器电话上单击“发送”按钮时,购物对象已正确发送,并且我通过Log.d(StringNameOfShopping)

在终端上打印了该对象

但是我只能发送bytes[]数组,将其转换为int字节然后创建一个new String(buffer[], offset, bytes)

有没有一种方法可以将String(具有我的对象Shopping引用,例如Shopping@bd429a9)转换为Shopping对象?

这是我监听输入和输出的方法。

    public void run(){

        byte[] buffer = new byte[1024];  // buffer store for the stream

        int bytes; // bytes returned from read()

        // Keep listening to the InputStream until an exception occurs
        while (true) {
            // Read from the InputStream
            try {
                bytes = mmInStream.read(buffer);
                String incomingMessage = new String(buffer, 0, bytes);
                Log.d(TAG, "InputStream: " + incomingMessage);
            } catch (IOException e) {
                Log.e(TAG, "write: Error reading Input Stream. " + e.getMessage() );
                break;
            }
        }
    }

    //Call this from the main activity to send data to the remote device
    public void write(byte[] bytes) {
        String text = new String(bytes, Charset.defaultCharset());
        Log.d(TAG, "write: Writing to outputstream: " + text);
        try {
            mmOutStream.write(bytes);
        } catch (IOException e) {
            Log.e(TAG, "write: Error writing to output stream. " + e.getMessage() );
        }
    }

这是我的Serialize / Deserialize方法(但是我应该将它们放在哪里?在MainActivity中,还是Shopping Class中?在Bluetooth类中?

public byte[] serialize(Shopping shopping) throws IOException {
    ByteArrayOutputStream b = new ByteArrayOutputStream();
    ObjectOutputStream o = new ObjectOutputStream(b);
    o.writeObject(shopping);
    return b.toByteArray();
}

//AbstractMessage was actually the message type I used, but feel free to choose your own type
public static Shopping deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
    ByteArrayInputStream b = new ByteArrayInputStream(bytes);
    ObjectInputStream o = new ObjectInputStream(b);
    return (Shopping) o.readObject();
}

1 个答案:

答案 0 :(得分:0)

这将不起作用,因为另一部手机无法解析其自身内存中的对象。您需要serialize在一部手机上使用对象,然后在另一部手机上将其反序列化。

关于您的修改: 您已决定使用Java的序列化机制。为了使其正常工作,您需要在购物中实现Serializable接口。这只是一个“标记接口”,即它没有任何方法,只是表明该类可以与Java的序列化工具一起使用。

下一步是使用您要传输的serialize实例调用Shopping方法。这为您提供了一个包含序列化对象的字节数组。现在,您可以使用此字节数组调用write函数。

在接收端,您需要将整个输入流读取为字节数组。然后可以将此数组传递到deserialize以获得Shopping实例。