序列化给出了错误的对象大小

时间:2013-10-30 19:09:19

标签: java android serialization bytearray

我正在使用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)抛出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)都很小,以至于每个值都适合一个字节。我的问题是如何为每个整数值进行此操作总是会在数据流中使用四个字节?欢迎任何建议!

1 个答案:

答案 0 :(得分:1)

对象的序列化流包含:

  1. 对象流标题。
  2. 标记下一项是对象的信息。
  3. 对象的类信息。
  4. 对象的版本信息。
  5. 对象的每个序列化成员的类型名称值元组。