Java 字节数组的十六进制编码形式与同一字节数组不同“;对象”;转换为字节数组。为什么?

Java 字节数组的十六进制编码形式与同一字节数组不同“;对象”;转换为字节数组。为什么?,java,bytearray,apache-commons-codec,Java,Bytearray,Apache Commons Codec,问这个问题是出于好奇,而不是出于任何迫切需要。我找到了一些将对象转换为字节数组的代码(当时我想我需要它) 使用commons编解码器,我注意到纯字节数组的编码十六进制字符串表示与通过下面的“toByteArray”方法传递字节数组时得到的不同。我注意到较长的版本以较短的十六进制字符串表示形式结束 出于本能,这似乎不正确,为什么会发生这种情况 通过“toByteArray”转换方法找到的额外字节代表什么 我猜这和编码有关吧 非常感谢,我希望这不是一个太多的新手问题 import java.io.B

问这个问题是出于好奇,而不是出于任何迫切需要。我找到了一些将对象转换为字节数组的代码(当时我想我需要它)

使用commons编解码器,我注意到纯字节数组的编码十六进制字符串表示与通过下面的“toByteArray”方法传递字节数组时得到的不同。我注意到较长的版本以较短的十六进制字符串表示形式结束

出于本能,这似乎不正确,为什么会发生这种情况

通过“toByteArray”转换方法找到的额外字节代表什么

我猜这和编码有关吧

非常感谢,我希望这不是一个太多的新手问题

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import org.apache.commons.codec.binary.Hex;

public class Test {

    public static void main(String[] args) throws IOException {
        byte[] bytes = "Stackoverflow".getBytes();
        System.out.println(Hex.encodeHexString(bytes));
        System.out.println(Hex.encodeHexString(toByteArray(bytes)));
    }

    public static byte[] toByteArray(Object obj) throws IOException {
        byte[] bytes = null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(obj);
        oos.flush();
        oos.close();
        bos.close();
        bytes = bos.toByteArray();
        return bytes;
    }
}
结果

537461636b6f766572666c6f77 ACED0057200025B42ACF317F8060854E0020000787000000D537461636B6F766572666C6F77


第二种编码更长,因为它是一种对象序列化格式,而第一种情况只是内容。对象序列化具有头、对象类型以及对象中的最终内容(您会注意到结尾是相同的)

ObjectOutputStream可以序列化任何类型的对象(只要它是可序列化的)。因此,它无法真正将任何
字节[]
映射到自身,因为这意味着没有空间容纳其他对象。

谢谢-我仍然不能正确理解这一点(但这不是你的错!)。在我看来,使用ObjectOutputStream不适合这种情况。也许DataOutputStream会给我一些更接近我预期的结果——尽管它已经是一个字节数组,所以不需要进一步处理。