簡體   English   中英

將類對象轉換為字節緩沖區

[英]Converting class objects to byte buffer

我有一個包含兩個帶有一些變量的類對象的類。 我想通過具有發送功能的USB通過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();
}

我的問題是這是否是一個好的解決方案?

您可以讓您的類實現Serializable接口 ,然后通過字節流發送該接口 但這是一個非常糟糕的主意,很可能行不通。

之所以無法奏效或不能保證奏效的原因是,不能保證Java的不同實現將使用相同的序列化機制,因此字節數組在不同的Java實現中可能會非常不同。

相反,我建議您將對象轉換為xml或json之類的中間格式,然后將其發送。 這樣,接收器甚至不必使用Java進行編碼。

您可以在這里參考:將對象轉換為字節數組,並將字節數組轉換為對象http://www.java2s.com/Code/Java/File-Input-Output/Convertobjecttobytearrayandconvertbytearraytoobject.htm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM