我有一个类,它包含两个带有一些变量的类对象。我想通过带有发送功能的USB发送类的实例(并在另一侧接收)。 send函数接受字节数组(byte [])。
我的问题是我如何将类的实例转换为字节数组,以便我可以发送它?我如何在另一边正确地重建它呢?
下面是我要发送和接收的te类Comsstruct。欢迎任何吸烟!
// ObjectInfo struct definition
public class ObjectInfo {
int ObjectXCor;
int ObjectYCor;
int ObjectMass;
};
// ObjectInfo struct definition
public class SensorDataStruct{
int PingData;
int IRData;
int ForceData;
int CompassData;
};
// ObjectInfo struct definition
public class CommStruct{
public ObjectInfo VisionData;
public SensorDataStruct SensorData;
};
public CommStruct SendPacket;
public CommStruct RecievePacket;
我找到了一个解决方案,但有一些建议,我想知道这是否有效(如果这是一个很好的解决方案)?
有序列化方法和发送方法:
// Method to convert object to a byte array
public static byte[] serializeObject(CommStruct obj) throws IOException
{
ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bytesOut);
oos.writeObject(obj);
oos.flush();
byte[] bytes = bytesOut.toByteArray();
bytesOut.close();
oos.close();
return bytes;
}
// Send struct function
public void Send(){
try
{
// First convert the CommStruct to a byte array
// Then send the byte array
server.send(serializeObject(SendPacket));
}
catch (IOException e)
{
Log.e("microbridge", "problem sending TCP message", e);
}
收到处理函数:
public void onReceive(com.example.communicationmodulebase.Client client, byte[] data)
{
// Event handler for recieving data
// Try to receive CommStruct
try
{
ByteArrayInputStream bytesIn = new ByteArrayInputStream(data);
ObjectInputStream ois = new ObjectInputStream(bytesIn);
RecievePacket = (CommStruct) ois.readObject();
ois.close();
}
catch (IOException e)
{
Log.e("microbridge", "problem recieving TCP message", e);
}
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("microbridge", "problem recieving TCP message", e);
}
// Send the recieved data packet back
SendPacket = RecievePacket;
// Send CommStruct
Send();
}
我的问题是,这是否是一个好的解决方案?
答案 0 :(得分:5)
您可以让您的类实现Serializable
interface,然后通过字节流发送它。但这是一个非常糟糕的主意,很可能无法发挥作用。
为什么这不起作用或者不能保证起作用的原因是,不能保证java的不同实现将使用相同的序列化机制,因此bytearray在不同的{{3 }}。
相反,我建议你将对象转换为某种中间格式,如xml或json,然后发送它。这样接收器甚至不必用java编码。
答案 1 :(得分:0)
你可以在这里参考: 将对象转换为字节数组并将字节数组转换为对象 http://www.java2s.com/Code/Java/File-Input-Output/Convertobjecttobytearrayandconvertbytearraytoobject.htm