我正在开发一个 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 个整数(所以大小应该是 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;
}
现在我只有一个问题:当我读出字节缓冲区的大小时,大小是 7。这是(我认为)因为整数的所有值(0)都非常小,以至于它们每个都适合一个字节。我的问题是我怎样才能使每个整数值在数据流中始终使用四个字节?欢迎任何建议!