0

私はシリアライゼーションを使用してオブジェクトをバイト配列に変換する Android アプリに取り組んでいます。変換後、サイズを読み取ると、バイト配列の値がはるかに大きくなりました。

私が行った方法は次のとおりです。

public void Send(testpacket packet){        
    try
    {           
        // First convert the CommStruct to a byte array
        // Then send the byte array
        byte [] buffer = toByteArray(packet);

        int size = buffer.length;

        System.out.println("SIZE OF BYTE ARRAY: " + size);

        server.send(buffer);

    } 
    catch (IOException e)
    {
        Log.e("USBCommunicator", "problem sending TCP message", e);
    }   
}

シリアル化メソッド toByteArray は、オブジェクトをバイト配列に変換し、次のようになります。

  public static byte[] toByteArray(Object obj) throws IOException {
        byte[] bytes = null;
        ByteArrayOutputStream bos = null;
        ObjectOutputStream oos = null;
        try {
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            oos.writeObject(obj);
            oos.flush();
            bytes = bos.toByteArray();
        } finally {
            if (oos != null) {
             Log.i(TAG, "not null");
                oos.close();
            }
            if (bos != null) {
                bos.close();
             Log.i(TAG, "not null");
            }
        }
        return bytes;
    }

オブジェクト パケットは、合計 7 個の整数を持つ 2 つのクラスで構成されます (したがって、サイズは 28 バイトである必要があります)。また、次のように定義されています。

public class testpacket implements java.io.Serializable {

public ObjectInfo VisionData;
public SensorDataStruct SensorData;

//Constructor
public testpacket(){
     // Call constructors
     VisionData = new ObjectInfo();
     SensorData = new SensorDataStruct();
}
 }

ObjectInfo は次のもので構成されます。

//ObjectInfo struct definition
public class ObjectInfo implements java.io.Serializable
{
public int ObjectXCor;
public int ObjectYCor;
public int ObjectMass;

//Constructor
public ObjectInfo(){
    ObjectMass = 0;
    ObjectXCor = 0;
    ObjectYCor = 0;
}
};

SensorDataStruct は次のとおりです。

//ObjectInfo struct definition
public class SensorDataStruct implements java.io.Serializable
{
public int PingData;
public int IRData;
public int ForceData;
public int CompassData;

//Constructor
public SensorDataStruct(){
    CompassData = 0;
    ForceData = 0;
    IRData = 0;
    PingData = 0; 
}
};

しかし、変換後にバイトバッファーの長さを読み取ると、サイズは 426 です。これが 28 バイトではない理由や提案はありますか? さらに情報を提供する必要がある場合は、そう言ってください! ヒントや提案は大歓迎です!

アップデート

EJPの助けを借りてコードを変更しました。DataOutputStream を使用して、オブジェクト データ (実際の変数データ) をバイトに変換します。この記事で説明したオブジェクトには 7 つの整数が含まれており、オブジェクトが作成されたとき、これらすべての整数の開始値は 0 です。

変換関数は次のとおりです。

public static byte[] toByteArray(testpacket obj) throws IOException { byte[] bytes = null;

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream w = new DataOutputStream(baos);

        w.write(obj.SensorData.CompassData);
        w.write(obj.SensorData.ForceData);
        w.write(obj.SensorData.IRData);
        w.write(obj.SensorData.PingData);

        w.write(obj.VisionData.ObjectMass);
        w.write(obj.VisionData.ObjectXCor);
        w.write(obj.VisionData.ObjectYCor);

        //w.flush();

        bytes = baos.toByteArray();  

        int size = bytes.length;

        System.out.println("SIZE OF BYTE ARRAY IN CONVERTION FUNCTION: " + size);


                return bytes;

}

ここで質問が 1 つだけあります。バイト バッファーのサイズを読み取ると、サイズは 7 です。これは (私が思うに) 整数のすべての値 (0) が非常に小さいため、それぞれ 1 バイトに収まるためです。私の質問は、整数値ごとにこれをどのように作成できるかです。データストリームでは常に4バイトが使用されますか? どんな提案も大歓迎です!

4

1 に答える 1

1

オブジェクトのシリアル化されたストリームには次が含まれます。

  1. オブジェクト ストリーム ヘッダー。
  2. 次の項目がオブジェクトであるというタグ情報。
  3. オブジェクトのクラス情報。
  4. オブジェクトのバージョン情報。
  5. オブジェクトのシリアル化されたメンバーごとの型-名前-値のタプル。
于 2013-10-30T19:22:15.917 に答える