0

嘿伙计们!我一直在寻找一些关于 Java 序列化的旧帖子。我想将一个对象转换为一个字节数组。到目前为止,我已经这样做了:

public class test 
{

    public static void main(String[] args) throws IOException 
    {
        // 00111111 00111111 00111111 11110000  - in bytes: 63, 63, 63, 240
        int x = 1061109744; 
        byte[] bytes = null;

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutput out = null;
        try {
            out = new ObjectOutputStream(bos);   
            out.writeObject(x);
            bytes = bos.toByteArray();

        } 
        finally 
        {
            out.close();
            bos.close();
        }

        System.out.println("Lenght: " + bytes.length);

        for(int i=0; i < bytes.length; i++)
        {
            System.out.println(bytes[i]);
        }
    }
}

显然它工作得很好,但它在ByteArray. 我真正感兴趣的值是与我的“int x = 1061109744;”相对应的最后 4 个字节。

为什么会这样?

是否可以避免“垃圾”值?

是否有可能超过“签名”值?(我必须写大于 128 的字节值)。

4

2 回答 2

1

是否可以避免“垃圾”值?

是的。写出一个int,而不是一个Object。通过传递intto writeObject,您将其提升(自动装箱) to Integer,这意味着序列化信息包含标头信息,表明它是Integer object,而不是int. 您ByteArrayOutputStream有一个write(int)将一个字节(int 的低 8 位)写入输出流的方法。这些是否签名纯粹是解释问题,而不是流中的位。

于 2013-05-04T21:58:33.873 回答
1

DataOutputStream逐字段序列化的使用和字段:

ByteOutputStream baos = new ByteOuputStream();
DataOutputStream dos = new DataOutputStream(baos);

dos.writeInt(x);

dos.close();
bytes = baos.toByteArray();

在字节数组中,所有元素都是有符号的(自然地)。但如果你想打印它们未签名:

for(int i=0; i < bytes.length; i++)
{
    System.out.println(0xFF & bytes[i]);
}
于 2013-05-04T23:15:48.400 回答