2013-05-04 79 views
0

Hy guys!我一直在寻找一些关于Java中的序列化的旧帖子。 我想将一个对象转换成一个ByteArray。到目前为止,从来就做到了这一点:java将对象序列化为ByteArray

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]); 
    } 
} 
} 

Aparently它的作品不错,但它引入了大量的“垃圾”到ByteArray。真正感兴趣的值是与我的“int x = 1061109744;”相对应的最后4个字节。

为什么会发生?

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

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

请帮忙。

+0

您可以点击这里http://stackoverflow.com/questions/2836646/java-serializable-object-to-byte-array – 2013-05-04 21:55:15

回答

1

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

是的。写出int,而不是Object。通过传递一个intwriteObject,你推动它(它自动装箱)到Integer,这意味着序列化的信息中包含的头信息说,这是一个Integer对象,不是int。您的ByteArrayOutputStream有一个write(int)方法,它将一个字节(int的低8位)写入输出流。无论是否签名,纯粹是一个解释问题,而不是流中的各个部分。

+0

在这个例子中我所示,变量“x”仅用于测试目的。实际上,我想编写一个名为“EventParser”的完整对象,其中包含int和long类型。而我仍然有“签名”的问题。 – eduardo 2013-05-04 22:13:19

+1

@eduardo:好吧,如果你打算在你的“真实”代码中使用一个对象,那么显示一个使用原语的例子是没有意义的。如果你不想要“垃圾”,写你自己的序列化格式。 Java序列化格式包括有关正在写入流的对象类型的头信息;这点很重要。再次说明:符号是*解释*的问题,而不是流中的位。 – 2013-05-04 22:14:22

+0

对不起,我的错误。现在我了解了“签名”!如果我试图打印它当然它会显示签名,但正如你所说,在流中它只是位。 – eduardo 2013-05-04 22:21:22

0

使用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]); 
}