我目前正在通过蓝牙从用户向另一个对象发送商品(购物)。
当我从服务器电话上单击“发送”按钮时,购物对象已正确发送,并且我通过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();
}
答案 0 :(得分:0)
这将不起作用,因为另一部手机无法解析其自身内存中的对象。您需要serialize在一部手机上使用对象,然后在另一部手机上将其反序列化。
关于您的修改:
您已决定使用Java的序列化机制。为了使其正常工作,您需要在购物中实现Serializable
接口。这只是一个“标记接口”,即它没有任何方法,只是表明该类可以与Java的序列化工具一起使用。
下一步是使用您要传输的serialize
实例调用Shopping
方法。这为您提供了一个包含序列化对象的字节数组。现在,您可以使用此字节数组调用write
函数。
在接收端,您需要将整个输入流读取为字节数组。然后可以将此数组传递到deserialize
以获得Shopping
实例。