私はシリアライゼーションを使用してオブジェクトをバイト配列に変換する 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バイトが使用されますか? どんな提案も大歓迎です!