【问题标题】:java Serialize Object to ByteArrayjava 将对象序列化为字节数组
【发布时间】:2013-04-29 01:30:32
【问题描述】:

大家好!我一直在寻找一些关于 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 的字节值)。

【问题讨论】:

标签: java object serialization signed


【解决方案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]);
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 在我展示的示例中,变量“x”仅用于测试目的。实际上,我想编写一个名为“EventParser”的完整对象,其中包含 int 和 long 类型。而且我仍然遇到“签名”问题。
    • @eduardo:好吧,如果您要在“真实”代码中使用对象,那么展示使用原语的示例是没有意义的。如果您不想要“垃圾”,请编写自己的序列化格式。 Java 序列化格式包括有关写入流的对象类型的标头信息;这就是重点。再说一遍:符号是解释的问题,而不是流中的位。
    • 对不起我的错误。现在我知道了“签名”!如果我尝试打印它,它当然会显示签名,但正如你所说,在流中它只是位。
    猜你喜欢
    • 2014-09-02
    • 2011-02-19
    • 2014-12-07
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    相关资源
    最近更新 更多