2013-10-28 37 views
-1

我有一个类包含两个具有一些变量的类对象。我想通过带发送功能的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; 

更新

我已经找到了解决方案,但与我有我不知道这是否会工作(如果它是一个很好的解决方案)的建议吗?

有一个serialsation方法和发送方法:

// 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

http://stackoverflow.com/questions/2836646/java-serializable-object-to-byte-array – Chill

+0

在您对我的回答的评论中,您说接收器将运行在Arduino上?你写的接收器是用Java编写的?我很抱歉,但如果不知道更确切地说明你想要完成的是什么,就很难给出正确的答案。 –

回答

4

你可以有你的类实现Serializable interface,然后发送了一个字节流。但这是一个非常糟糕的主意,很可能无法工作。

为什么这不起作用,或者不能保证工作的原因是,不能保证java的不同实现将使用相同的序列化机制,因此字节阵列可能会在不同的Java implementations中有所不同。

相反,我建议您将对象转换为xml或json等中间格式,然后发送。这样接收器甚至不需要用java编码。

+0

感谢您的评论,其他人是Arduino微控制器。这两个系统通过adb/usb连接。 Arduino代码是C/C++。我找到了一些解决方案,并会在更新后发布。你认为这是一个很好的解决方案,并将工作或使用JSON? – Roy08

+0

C/C++代码将无法读取/写入序列化的java对象! –

+0

@ArneBurmeister:感谢您的评论,maby astupit问题,但为什么?我正在使用Microbridge服务器为Android手机和带有USB屏蔽的Arduino之间的adb连接。 – Roy08

相关问题