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 个整数(所以大小应该是 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)都非常小,以至于它们每个都适合一个字节。我的问题是我怎样才能使每个整数值在数据流中始终使用四个字节?欢迎任何建议!

4

1 回答 1

1

对象的序列化流包含:

  1. 对象流标头。
  2. 表示下一个项目是对象的标记信息。
  3. 对象的类信息。
  4. 对象的版本信息。
  5. 类型-名称-值元组,用于对象的每个序列化成员。
于 2013-10-30T19:22:15.917 回答