1

いくつかの変数を持つ 2 つのクラス オブジェクトを含むクラスがあります。送信機能を使用してクラスのインスタンスを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 メソッドと send メソッドがあります。

// 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();
}

私の質問は、これが良い解決策であるかどうかです。

4

2 に答える 2

6

クラスにSerializableinterfaceを実装させ、それをバイトストリーム経由で送信できます。しかし、それは本当に悪い考えであり、おそらくうまくいかないでしょう。

これが機能しない、または機能することが保証されていない理由は、 Javaの異なる実装が同じシリアライズ メカニズムを使用するという保証がないためです。

代わりに、オブジェクトを xml や json などの中間形式に変換して、代わりに送信することをお勧めします。そうすれば、レシーバーを Java でコーディングする必要さえありません。

于 2013-10-28T19:31:34.210 に答える
0

ここで参照できます: オブジェクトをバイト配列に変換し、バイト配列をオブジェクトに変換します http://www.java2s.com/Code/Java/File-Input-Output/Convertobjecttobytearrayandconvertbytearraytoobject.htm

于 2013-10-28T19:31:15.513 に答える