代码之家  ›  专栏  ›  技术社区  ›  Manas Pratim Chamuah

将字节数组转换为对象是否会增加大小。。?

  •  3
  • Manas Pratim Chamuah  · 技术社区  · 11 年前

    我的代码如下。。

    private Object populateObj(InputStream inputStream) {
            int i=0;
            Object resObject = null;
            try {
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                int next = inputStream.read();
                while (next > -1) {
                    i++;
                    bos.write(next);
                    next = inputStream.read();
                }
                bos.flush();
                byte[] result = bos.toByteArray();
                System.out.println("Size of byte array 1: "+result.length);
                System.out.println("Result is []");
                for(int j=0;j<result.length;j++){
                    System.out.println(result[j]);
                }
                resObject = result;
                byte[]  result2=toByteArray(resObject);
                System.out.println("Size of byte array 2 : "+result2.length);
                System.out.println("Result2 is []");
                for(int j=0;j<result.length;j++){
                    System.out.println(result2[j]);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            System.out.println("size of inputStream in bytes : "+i);
            return resObject;
        }
    

    用于将对象转换为字节数组的代码为:-

    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) {
                    oos.close();
                }
                if (bos != null) {
                    bos.close();
                }
            }
            return bytes;
        }
    

    当我比较两个字节数组的长度时,它的不同。会添加一些额外的字节,但在哪个转换点。。?(当将字节数组分配给对象时,或当) 输入流的大小与第一个字节数组的大小相同。

    我想将http请求的Inputstream转换为resObject,然后将其提供给outputstream。使用ObjectInputStream.readObject()将提供StreamCorruptedException。

    2 回复  |  直到 11 年前
        1
  •  8
  •   JB Nizet    11 年前

    您正在使用Java对象序列化对字节数组进行序列化。这会对原始字节数组产生开销,因为序列化流包含一个序列化头、要序列化的对象的类的名称,以及一些额外的字节,以便能够知道对象在流中的开始和结束位置。

    记住,在反序列化时,接收方对ObjectInputStream的内容一无所知。因此,它必须能够知道已序列化的是单字节数组(而不是String、Integer或任何其他可序列化对象)。因此,这些信息必须以某种方式存储在流中,因此需要一些额外的字节。

        2
  •  0
  •   fipple    11 年前
        byte[] array = new byte[] { 1, 2, 3, 4 };
        System.out.println(array.length);
    
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(array);
        oos.close();
    
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        Object obj = ois.readObject();
        ois.close();
    
        System.out.println(((byte[]) obj).length);