如何将非可序列化对象转换为字节数组?

时间:2010-04-01 20:10:17

标签: java serialization

我正在尝试使用javax.crypto.Cipher.doFinal(byte [])方法来加密对象。但是,出于安全原因,该对象无法序列化。 那么,如何在没有序列化的情况下将对象转换为字节数组?

- 更新

使用序列化是使用此Cipher方法的唯一方法吗?因为据我所知,重要数据不应该是可序列化的。

5 个答案:

答案 0 :(得分:0)

您只需序列化每个组件。递归。最终,您最终会得到可以序列化的本机对象。

如果通过实现java的序列化方法来实现它,java将确保您不会对任何对象进行两次序列化,并会为您处理引用。

简而言之,将对象序列化。

答案 1 :(得分:0)

这是一个将类序列化为字节数组的简单示例。

public Class Foo {

    private boolean isHappy;
    private short happyCount;
    private Bar bar;

    public byte[] serializeData () throws IOException
    {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        DataOutputStream out = new DataOutputStream( stream );

        out.writeBoolean(isHappy);
        out.writeShort( slope );

        // Serialize bar which will just append to this byte stream
        bar.doSerializeData(out);

        // Return the serialized object.
        byte[] data = stream.toByteArray();

        // Clean up.
        stream.close();

        return data;
    }
}

当然,你案例中的很多细节都取决于你的班级结构,但希望这会让你指出正确的方向。

要反序列化,您只需要反转上述内容。

答案 2 :(得分:0)

解决, 而不是使用getByteArray()来调用Cipher.doFinal(),我将在类中使用Cipher.doFinal(),使用getEncryptedByteArray()方法;所以我在类中序列化数据而不使类本身可序列化,并且返回结果将被加密。 对此方法的任何异议都将被视为...... :)

答案 3 :(得分:0)

我使用了com.fasterxml.jackson.databind.ObjectMapper。

  private static byte[] serialize(Object obj) throws IOException {
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    mapper.writeValue(os, obj);

    return os.toByteArray();
}

答案 4 :(得分:-1)

java.beans.XMLEncoder中/解码器。